2012-08-27 5 views
2

두 테이블이 있습니다. 제품 목록이있는 tblProduct와 소비 된 제품 ID가있는 소비자 이름이있는 tblConsumer입니다. 이제 제품 테이블에서 모든 제품을 소비 한 소비자의 이름을 찾아야합니다.INTERSECT를 사용하는 SELECT 문

INTERSECT를 사용하여이 문제를 해결하려고했지만 문제는 WHERE 절에서 각 productid를 제공한다는 것입니다. 이 구문은 내가 원하는 결과를 제공하지만 각 제품 ID를 지정할 필요가없는이 쿼리를 작성하는 방법은 무엇입니까? 실제로 tblProducts의 모든 제품을 나열하고자하는 경우 당신은 당신이 검사 할 제품의 목록이있는 경우

SELECT ConsumerName FROM tblConsumer WHERE ProductID= 1 
INTERSECT 
SELECT ConsumerName FROM tblConsumer WHERE ProductID =2 
INTERSECT 
SELECT ConsumerName FROM tblConsumer WHERE ProductID =3 


tblProduct 
--------------------------------- 
ProductID | Product Name 
--------------------------------- 
    1  | Mango 
    2  | Orange 
    3  | Banana 

tblConsumer 
--------------------------------- 
ConsumerName | ProductID 
--------------------------------- 
David  | 1 
David  | 3 
David  | 2 
Henry  | 3 
Henry  | 2 
+0

내 문장을 용서해주세요.하지만 'INTERSECT'를 SQL 문장으로 알지 못해 'UNION'을 의미합니까? 오, 사용중인 DB를 지정하십시오. –

+0

@AdrianCornish : INTERSECT는 쿼리를 결합하는 완벽한 방법으로 PostgreSQL은 최소한 지원합니다 : http://www.postgresql.org/docs/current/interactive/queries-union.html –

+0

@ AdrianCornish - INTERSECT는 많은 RDBMS에서 유효합니다. –

답변

6

, 당신은 당신이, 그렇지 않으면 ... NOT이 존재

을 사용할 수 있습니다 같은 것을 수행 할 수 있습니다

SELECT c.ConsumerName 
FROM tblConsumer AS c 
WHERE c.ProductID IN (1,2,3) 
GROUP BY c.ConsumerName 
HAVING COUNT(DISTINCT c.ProductID) = (SELECT COUNT(DISTINCT p.ProductID) FROM tblProduct WHERE p.ProductID IN (1,2,3)) 
; 

을하지만 난 당신이 그냥 그들이 구입하지 않은 기록 거기 누구를 위해 소비자를 제거하기 위해 존재 사용할 어쩌면 생각합니다. 이처럼

:

SELECT * 
FROM tblPerson AS pn CROSS JOIN tblProduct AS pt /* Every possible combo */ 
WHERE NOT EXISTS (SELECT * FROM tblConsumer c 
        WHERE c.ConsumerName = pn.ConsumerName 
        AND c.ProductID = pt.ProductID) 
; 
+0

tblProduct에 Peach라는 신제품을 추가했을 때, 쿼리는 여전히 동일한 소비자의 이름을 보유하고있었습니다. 새로운 제품을 추가 한 후에는 구문이 다른 제품을 소비하지 않으므로 다른 사람의 이름을 반환해서는 안됩니다. 왜 그것이 작동하지 않았다는 어떤 생각? – Shai

+0

왜냐하면 거기에 c.ProductID IN (1,2,3) –

+1

네, András 지적으로, 그 첫 번째 쿼리에 관심있는 ID의 목록이 있습니다. 두 번째 쿼리는 전체 테이블을 원할 경우 사용할 수 있습니다. 또는 두 번째 WHERE 절을 첫 번째 쿼리에서 제거 할 수 있습니다. –

0

내가 다른 작은 솔루션을 가지고 : 당신이 너무 새 항목을 추가하는 경우

SELECT * FROM tblConsumer 
WHERE NOT EXISTS (SELECT * FROM tblProduct 
       LEFT JOIN tblConsumer C ON tblProduct.ProductID = C.ProductID AND tblConsumer .ConsumerName = C.ConsumerName 
       WHERE C.ConsumerName IS NULL) 

그것은 작동합니다. 단지 소비자가 특정 소비자와 제품을 연결할 수없는 레코드가 있는지 확인합니다.