【发布时间】:2020-05-21 13:27:11
【问题描述】:
我有 2 个表,我想在 2 个表连接在一起之前过滤这两个表中的数据。
客户表:
╔══════════╦═══════╗
║ Customer ║ Year ║
╠══════════╬═══════╣
║ A ║ 2018 ║
║ B ║ 2019 ║
║ C ║ 2020 ║
╚══════════╩═══════╝
条目表:
╔══════════╦═══════╦══════════╗
║ Customer ║ Entry ║ Category ║
╠══════════╬═══════╬══════════╣
║ A ║ 5575 ║ D ║
║ A ║ 6532 ║ C ║
║ A ║ 3215 ║ D ║
║ A ║ 5645 ║ M ║
║ B ║ 3331 ║ A ║
║ B ║ 4445 ║ D ║
╚══════════╩═══════╩══════════╝
我想离开加入,所以我从客户表中获取所有记录,年份为 2019 年和 2020 年。此外,我想在加入前过滤条目表中的类别 D。
期望的结果:
╔══════════╦═══════╦═══════╗
║ Customer ║ Year ║ Entry ║
╠══════════╬═══════╬═══════╣
║ ║ ║ ║
║ ║ ║ ║
║ B ║ 2019 ║ 4445 ║
║ C ║ 2020 ║ NULL ║
╚══════════╩═══════╩═══════╝
如果我要执行以下查询:
SELECT Customer.Customer, Customer.Year, Entry.Entry
FROM Customer
LEFT JOIN Entry
ON Customer.Customer=Entry.Customer
WHERE customer.year in ('2019','2020') and Entry.Category='D'
另外,也可以通过下面的查询来完成
SELECT Customer.Customer, Customer.Year, Entry.Entry
FROM (select * from Customer where year in ('2019','2020')) Customer
LEFT JOIN (select * from Entry where Category='D') Entry
ON Customer.Customer=Entry.Customer
哪个查询会更优化和更快?
提前感谢任何帮助!
【问题讨论】:
-
对于此类问题,最好检查两个查询的查询执行计划并进行比较。对于 SQL Server,您可以在 Management Studio 中使用 Include Actual Execution Plan 选项。
标签: sql sql-server database where-clause