SQL选择记录组

问题描述

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