问题描述
|
有没有更快的方法可以在名为OrderDtl的表上编写以下查询?
OrderId Product
1 ORANGE
1 APPLE
2 SHAMPOO
2 SOAP
2 TOOTHPASTE
SELECT *
FROM OrderDtl
WHERE OrderId in
(
SELECT OrderId
FROM OrderDtl
WHERE Product=\'APPLE\'
)
导致
1 ORANGE
1 APPLE
解决方法
将表加入自身。
在看到来自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\'
)
比较生成的执行计划很有趣,对于这个简单的示例,结果是相同的:
编辑:
添加基本答案的执行计划,在执行“努力”时再次相同
您可能对本文也有兴趣:SQL Server:JOIN vs IN vs EXISTS-逻辑差异
,SELECT ord2.*
FROM OrderDtl ord1 INNER JOIN OrderDt1 ord2
ON ord1.Product = \'APPLE\' AND ord2.OrderId = ord1.OrderId