SQL选择记录组

Dan*_*ing 1 sql

有没有更快的方法在名为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)

Ton*_*ony 5

加入桌子自己.

看到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 - 逻辑区别