连接时过滤数据

7cjasjjr  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(220)

我有两个表,我想在两个表连接在一起之前过滤两个表中的数据。
客户表:

╔══════════╦═══════╗
   ║ 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        ║
   ╚══════════╩═══════╩══════════╝

我想离开join,以便从customer表中获取2019年和2020年的所有记录。此外,我还想在join之前过滤entry表中的category 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 哪个查询会更优化和更快?
谢谢你的帮助!!

xurqigkl

xurqigkl1#

你似乎想把两者都过滤掉 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 进入 WHERE 条款。后续表上的筛选器位于 ON 条款。

相关问题