2010-06-02 3 views
0

쿼리 결과를 받아서 셀 열 대신 CSV 문자열로 반환 할 수 있는지 궁금합니다.쿼리 결과를 가로로 표시

기본적으로 Customers 테이블이 있고 우리는 CustomerTypeLines 테이블을 가지고 있으며 각 Customer는 여러 CustomerTypeLines을 가질 수 있습니다. 내가 대해 쿼리를 실행할 때 나는 여러 종류를 확인하고자 할 때 , 나는 예를 들어, 문제로 실행 : 고객이 같은 줄에 모두가 할 수 없기 때문에

Select * 
     from Customers a 
Inner Join CustomerTypeLines b on a.CustomerID = b.CustomerID 
    where b.CustomerTypeID = 14 and b.CustomerTypeID = 66 

는 ... 아무 것도 반환하지 않습니다, 분명히 .

작동 시키려면 Customers_types라는 Customers 필드에 ,14,66,67,과 같은 필드를 추가해야합니다. 따라서은 85 행을 반환합니다.

당연히 CustomerTypeLines 테이블이 변경 될 때마다 해당 고객에 대해이 필드를 다시 작성해야하기 때문에 이것은 고통입니다.

내가 된 하위 쿼리를 할 수 있다면 좋을 텐데 내 그 날의 일을, 그래서 그 대신 같은 결과를 반환하는 것입니다 : 그것은 ,14,66,67,

처럼 그들을 반환

14 
66 
67 

이것이 가능합니까?

답변

1

LIKE 쿼리를 쉼표로 구분 된 목록으로 사용하는 모든 종류의 문제가 발생합니다. 알아, 나 거기에 갔다.

예를 들어, '%,14,%'을 검색하면 14가 목록의 첫 번째 항목 또는 마지막 항목 인 경우 어떻게됩니까? (나는 당신이 여분의 선행 및 후행 쉼표를 지정한다는 것을 알고 있지만, COALESCE 메서드는이를 제공하지 않습니다.)

방법 대신 이것에 대해 :

Select * from Customers a 
Inner Join CustomerTypeLines b 
on a.CustomerID = b.CustomerID 
WHERE a.CustomerID in 
    (SELECT customerID from CustomerTypeLines 
    WHERE CustomerTypeID = 14) 
AND a.CustomerID in 
    (SELECT customerID from CustomerTypeLines 
    WHERE CustomerTypeID in 66) 

편집 질문의 overhasty 읽기를 해결하기!

+0

쉼표 에 의해 기록을 구분하기 위해 XML을위한 PATH 절을 사용할 수 있습니다 모두 * 14 (66) –

+0

@Martin 스미스 : 고정, 감사합니다. – egrunin

+0

왜 downvote? – egrunin

2

비정규 화하지 않고이를 수행하려면 다음과 같은 것을 사용하여 IN 절의 모든 값과 일치하는 모든 Customers의 테이블을 가져와 결합 할 수 있습니다. 이것은 다음과 같은 relational division technique에 이미 올바른 형식이다

14 
66 
67 

:

SELECT CustomerId 
FROM CustomerTypes 
WHERE CustomerTypeID in (14, 66) 
GROUP BY CustomerId 
HAVING COUNT(DISTINCT CustomerTypeID) = 2 

사실 당신은 이미 같은 결과를 반환하는 쿼리가 그 질문에 말한다.

SELECT * 
FROM Customers c 
    WHERE NOT EXISTS 
    (
     SELECT * FROM @YourQuery y 
     WHERE NOT EXISTS 
      (
      SELECT * FROM CustomerTypeLines ctl 
      WHERE ctl.CustomerTypeID = y.CustomerTypeID 
      AND c.CustomerID = ctl.CustomerID 
      ) 
     ) 
1

a는 66 당신은 사용할 수 있습니다

SELECT 
    C.CustomerID, 
    C.SomeColumn 
FROM 
    Customers C 
WHERE 
    EXISTS (SELECT * FROM CustomerTypes CT1 WHERE CT1.CustomerID = C.CustomerID AND CT1.CustomerTypeID = 14) AND 
    EXISTS (SELECT * FROM CustomerTypes CT2 WHERE CT2.CustomerID = C.CustomerID AND CT2.CustomerTypeID = 66) 

더 일반적인 솔루션 (종속 될 고객 유형 ID를 임의의 수를 기반으로 고객을 검색 할 수 (예 : 테이블 매개 변수를 저장 프로 시저로 전달하는 방법)

0

잘못 설계했기 때문에 고통 스럽습니다.

고객은 CustomerType과 일대 다 많은 관계가 있으므로 한 필드에 모든 값을 방해하지 않고 이러한 값을 저장하는 다른 테이블을 작성해야합니다. 그렇게하면 더 쉽게 값을 쿼리 할 수 ​​있습니다. &.

그런 다음 고객 ID는 *에 대한 표시를 확인하지 않습니다 http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=createacommadelimitedlist

+0

그건 ** 디자인 방법 : ** 고객은'CustomerTypeLines'과 일대 다 관계가 있습니다. 그는 복합 조건을 검색하는 데 필요한 다중 절 쿼리에 대해 불평하고 있습니다. 당신이 "더 쉽고 빠르게"부르는 것은 그가 문제를 발견합니다. – egrunin

관련 문제