有没有更快的方法在名为OrderDtl的表上编写以下查询?
OrderId Product
1 ORANGE
1 APPLE
2 SHAMPOO
2 SOAP
2 TOOTHPASTE
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM OrderDtl
WHERE OrderId in
(
SELECT OrderId
FROM OrderDtl
WHERE Product='APPLE'
)
Run Code Online (Sandbox Code Playgroud)
结果如何
1 ORANGE
1 APPLE
Run Code Online (Sandbox Code Playgroud)
加入桌子自己.
看到Dems的评论后,我更改了SQL以添加几个索引:
CREATE TABLE #OrderDtl (OrderId INT, Product CHAR(10))
CREATE CLUSTERED INDEX IX_Order ON #OrderDtl (OrderId)
CREATE NONCLUSTERED INDEX IX_Order_Product ON #OrderDtl (Product) INCLUDE (OrderId)
INSERT #OrderDtl SELECT 1, 'ORANGE'
INSERT #OrderDtl SELECT 1, 'APPLE'
INSERT #OrderDtl SELECT 2, 'SHAMPOO'
INSERT #OrderDtl SELECT 2, 'SOAP'
INSERT #OrderDtl SELECT 2, 'TOOTHPASTE'
SELECT T2.*
FROM #OrderDtl T1 INNER JOIN #OrderDtl T2
ON T1.OrderId = T2.OrderId
WHERE T1.Product='APPLE'
SELECT *
FROM #OrderDtl
WHERE OrderId in
(
SELECT OrderId
FROM #OrderDtl
WHERE Product='APPLE'
)
Run Code Online (Sandbox Code Playgroud)
比较生成的执行计划很有意思,对于这个简单的例子,结果是相同的:

编辑: 添加esastincy答案的执行计划,在执行"努力"时再次相同

您可能也对本文感兴趣:SQL Server:JOIN vs IN vs EXISTS - 逻辑区别