2011-08-22 6 views
0

세부 정보 테이블이 있는데 다른 테이블의 값 목록과 정확히 일치하는 레코드를 가져 오려고합니다.오라클은 값 목록과 정확히 일치하는 행을 가져옵니다.

OrderDetailTable 
OrderID ItemID 
1  1 
1  2 
1  3 
1  4 
2  1 
2  2 
2  4 
3  1 
3  2 
3  3 
4  1 
4  2 


OrderedTable 
ItemID 
    1 
    2 

가 지금은 정확한 항목 ID가 OrderedTable 항목 ID와 일치 가지고에 OrderID를 얻으려면 : 는 여기에 시나리오입니다. 위 시나리오에서 ItemID 1,2,3은 OrderedTable ItemID와 정확히 일치하므로 OrderID 1은 유효합니다.

조인을 사용했지만 작동하지 않았습니다. 그것은 나에게 OrderID 1,2를 모두 주었다. 나는 그것을 어떻게 생각 하느냐?

답변

0

이 시도 :

SELECT OrderID 
FROM OrderDetailTable JOIN OrderedTable USING (ItemID) 
GROUP BY OrderID 
HAVING COUNT(DISTINCT ItemID) = (SELECT COUNT(DISTINCT ItemID) FROM OrderedTable) 

아이디어를 간단히 말해서, 같다 다음과 같습니다 :

많은 OrderDetailTable 행 항목 ID로 OrderedTable 일치 방법
  • 카운트,
  • 다음은 OrderedTable에서 ItemIDs의 총 수에 그 비교.

이 두 숫자가 동일하면 주어진 OrderID에 모든 ItemID가 "포함"됩니다. 하나가 다른 것보다 작 으면 지정된 OrderID에 포함되지 않은 ItemID가 하나 이상 있습니다.

기본 키에 따라 DISTINCT (필요하지 않을 수도 있음).

+0

또한 작동하지 않았습니다. – niceApp

+0

테스트 데이터에서 쿼리를 실행했는데 그 결과 하나의 행 (OrderID = 1) 만 생성되었습니다. 그것은 정확히 어떻게 "작동하지 않았다"? –

+0

샘플 데이터가 충분하지 않았습니다. 이제 작동하지 않는 곳에서 편집했습니다. – niceApp

0

SELECT * FROM OrderDetailTable WHERE OrderID NOT IN 
    (
    SELECT A.OrderID FROM 
    (
    SELECT 
     Y.OrderID 
     , OT.ItemID 
     , (SELECT Z.ItemID 
     FROM OrderDetailTable Z 
     WHERE Z.ItemID = OT.ItemID AND Z.OrderID = Y.OrderID 
     ) I 
    FROM OrderDetailTable Y, OrderedTable OT 
) A 
WHERE A.I IS NULL); 

편집을 시도 - 요청에 따라 더 나은 구문을 : ​​

SELECT * FROM 
OrderDetailTable Z WHERE Z.ORDERID NOT IN 
(
SELECT O1 FROM 
(SELECT Y.ORDERID O1, YY.ORDERID O2 FROM 
OrderDetailTable Y CROSS JOIN OrderedTable OT 
LEFT OUTER JOIN OrderDetailTable YY ON 
YY.ORDERID = Y.ORDERID AND YY.ITEMID = OT.ITEMID) ZZ WHERE ZZ.O2 IS NULL); 
+0

+1 좋은 쿼리이지만 왜 그렇게 끔찍한 암시 적 SQL '89 join (-1)을 사용합니까? – Johan

+0

여기에 간단한 쿼리가 있습니다. 그것은 잘 동작하지만 일어나는 것을 이해하는 것은 거의 어렵지 않습니다. – niceApp

+0

제 편집을보십시오 - 아마도 이것은 이해하기가 더 쉽습니다 ... – Yahia

관련 문제