微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL选择记录组

如何解决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
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。