【发布时间】:2020-11-27 00:33:15
【问题描述】:
我有以下表格:
客户
ID Name
============
1 John
2 Alice
3 Bob
订单
ID CustomerID Status
==========================
1001 1 1
1002 2 1
1003 2 2
1004 3 2
我想加入表格,每个客户只显示一个条目(状态最低的那个),即
ID Name OrderID
======================
1 John 1001
2 Alice 1002
3 Bob 1004
感谢this question 的回答,我选择了两个产生相同输出的解决方案:
解决方案 1
SELECT c.id, c.name, o.id FROM customers AS c
INNER JOIN orders AS o ON
c.id = o.customerid
WHERE o.status = (SELECT MIN(status) FROM orders WHERE customerid = c.id)
解决方案 2
SELECT c.id, c.name, o.id FROM customers as c
INNER JOIN orders AS o ON
o.id = (SELECT TOP 1 id FROM orders WHERE customerid = c.id ORDER BY status)
为了了解哪个运行得更快,我使用了SQL Fiddle View Execution Plan,它给出了以下内容:
解决方案 1
解决方案 2
如何解释这些图表,哪一个执行得更快? 使用 MS SQL Server 2016。
【问题讨论】:
-
执行计划并没有告诉你它的运行速度。你想要set-statistics-time。
-
Dale 是正确的(和/或使用最新版本的 SSMS,其中包括实际执行计划的时间)。但是,我很确定第一个会更快 - 第一个解决方案有 2 个表扫描,而第二个解决方案有 3 个表扫描,其中两个在嵌套循环连接中(例如,它可能运行很多次)。
标签: sql-server performance sqlfiddle