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