【问题标题】:Filtering data while joining加入时过滤数据
【发布时间】: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


【解决方案1】:

您似乎希望在ON 子句和WHERE 子句中都进行过滤:

SELECT c.Customer, c.Year, e.Entry
FROM Customer c LEFT JOIN
     Entry e
     ON c.Customer = e.Customer AND e.Category = 'D'
WHERE c.year in ('2019', '2020');

请注意,如果 year 是一个数字,则删除 IN 值中的单引号。

作为一般规则,LEFT JOIN 中的 first 表上的过滤器进入 WHERE 子句。后续表上的过滤器在 ON 子句上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 2020-03-09
    • 2011-06-23
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多