应用左连接之前的过滤表

Tom*_*kin 62 sql join filter where-clause

我有2个表,我想在2个表连接在一起之前过滤1个表.

客户表:

   ????????????????????
   ? Customer ? State ?
   ????????????????????
   ? A        ? S     ?
   ? B        ? V     ?
   ? C        ? L     ?
   ????????????????????
Run Code Online (Sandbox Code Playgroud)

参赛表:

   ???????????????????????????????
   ? Customer ? Entry ? Category ?
   ???????????????????????????????
   ? A        ?  5575 ? D        ?
   ? A        ?  6532 ? C        ?
   ? A        ?  3215 ? D        ?
   ? A        ?  5645 ? M        ?
   ? B        ?  3331 ? A        ?
   ? B        ?  4445 ? D        ?
   ???????????????????????????????
Run Code Online (Sandbox Code Playgroud)

好的我想要左连接,所以我从Customer表中获取所有记录,无论Entry表中是否有相关记录.不过,我想在类d筛选入口表在连接前.

期望的结果:

   ????????????????????????????
   ? Customer ? State ? Entry ?
   ????????????????????????????
   ? A        ? S     ?  5575 ?
   ? A        ? S     ?  3215 ?
   ? B        ? V     ?  4445 ?
   ? C        ? L     ?  NULL ?
   ????????????????????????????
Run Code Online (Sandbox Code Playgroud)

如果我要做以下查询:

   SELECT Customer.Customer, Customer.State, Entry.Entry
   FROM Customer
   LEFT JOIN Entry
   ON Customer.Customer=Entry.Customer
   WHERE Entry.Category='D'
Run Code Online (Sandbox Code Playgroud)

这将过滤掉最后一条记录.

所以我想要左表中的所有行,并将它加入到类别D上过滤的条目表中.

感谢提前的任何帮助!!

Tar*_*ryn 87

您需要将WHERE过滤器移动到以下JOIN条件:

SELECT c.Customer, c.State, e.Entry
FROM Customer c
LEFT JOIN Entry e
   ON c.Customer=e.Customer
   AND e.Category='D'
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

  • @TomJenkin感谢,顺便提一下你在网站上发布了一个很棒的第一个问题.很多细节等 (5认同)
  • 在“Postgres 11”中,此解决方案不起作用,因为它仅考虑连接操作的条件,然后返回左列中的所有记录 (3认同)
  • @bluefeet但两个执行计划都是平等的,不是吗? (2认同)

Jef*_*erg 19

你也可以这样做:

SELECT c.Customer, c.State, e.Entry
FROM Customer AS c
LEFT JOIN (SELECT * FROM Entry WHERE Category='D') AS e
ON c.Customer=e.Customer
Run Code Online (Sandbox Code Playgroud)

SQL小提琴在这里

  • 这也是另一种选择!有什么方法可取吗? (3认同)
  • @TomJenkin对于迟到的回复很抱歉,我一直都没有电脑.然而,出于好奇,我运行了这两个并检查了执行计划.执行计划几乎相同,但在更好的程度上,它似乎是Bluefeet的版本. (3认同)