Sql Oracle获取与值列表完全匹配的行

Sql Oracle获取与值列表完全匹配的行,sql,oracle,Sql,Oracle,我有一个details表,我想得到与另一个表中的值列表完全匹配的记录。 下面是一个场景: 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 现在我想获

我有一个details表,我想得到与另一个表中的值列表完全匹配的记录。 下面是一个场景:

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
现在我想获取OrderID,它的ItemID与OrderedTable ItemID完全匹配。在上述场景中,OrderID 1有效,因为ItemID 1,2,3与OrderedTable ItemID完全匹配

我使用了连接,但它不起作用。它给了我两个OrderID 1,2。我该怎么做?有什么想法吗?

试试看

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);
试试这个:

SELECT OrderID 
FROM OrderDetailTable JOIN OrderedTable USING (ItemID)
GROUP BY OrderID 
HAVING COUNT(DISTINCT ItemID) = (SELECT COUNT(DISTINCT ItemID) FROM OrderedTable)
简言之,其想法如下:

  • 按ItemID计算与OrderedTable匹配的OrderDetailTable行数
  • 然后将其与OrderedTable中的ItemID总数进行比较
如果这两个数字相等,则给定的OrderID“包含”所有ItemID。如果一个比另一个小,则至少有一个ItemID未包含在给定的OrderID中


根据主键的不同,
DISTINCT
可能不是必需的(尽管它不会造成伤害)。

+1很好的查询,但是为什么要使用可怕的隐式SQL'89 join(-1)?还有比这更简单的查询吗。它工作得很好,但了解发生了什么并不难。谢谢你,Yahia,它很容易理解,而且很有效。但如果没有交叉连接,有什么方法可以做到这一点,我在考虑性能。表中有比上述场景中更多的记录。据我所知不是。。。您的要求是OrderDetail中的ItemID必须根据OrderedTable中的所有值进行检查,这意味着必须存在交叉连接或(具有相同性能问题)FOR循环,这意味着PL/SQL(存储函数或任何匿名块)我对您的测试数据运行了查询,结果只生成了一行(OrderID=1)因此。它究竟是如何“不起作用的”?以前我的样本数据不够。现在我在不起作用的地方编辑了它。好的,我仍然得到一行(OrderID=1)和新的测试数据。怎么会错呢?