Sql 应用左联接前筛选表

Sql 应用左联接前筛选表,sql,join,filter,where-clause,Sql,Join,Filter,Where Clause,我有两个表,我想在将这两个表连接在一起之前过滤这1个表 客户表: ╔══════════╦═══════╗ ║ Customer ║ State ║ ╠══════════╬═══════╣ ║ A ║ S ║ ║ B ║ V ║ ║ C ║ L ║ ╚══════════╩═══════╝ 条目表: ╔══════════╦═══════╦══════════╗ ║ Cus

我有两个表,我想在将这两个表连接在一起之前过滤这1个表

客户表:

   ╔══════════╦═══════╗
   ║ Customer ║ State ║
   ╠══════════╬═══════╣
   ║ A        ║ S     ║
   ║ B        ║ V     ║
   ║ C        ║ L     ║
   ╚══════════╩═══════╝
条目表:

   ╔══════════╦═══════╦══════════╗
   ║ Customer ║ Entry ║ Category ║
   ╠══════════╬═══════╬══════════╣
   ║ A        ║  5575 ║ D        ║
   ║ A        ║  6532 ║ C        ║
   ║ A        ║  3215 ║ D        ║
   ║ A        ║  5645 ║ M        ║
   ║ B        ║  3331 ║ A        ║
   ║ B        ║  4445 ║ D        ║
   ╚══════════╩═══════╩══════════╝
我想要左联接,因此我从Customer表中获取所有记录,而不管Entry表中是否有相关记录。但是,我想在加入之前在条目表中筛选类别D

预期结果:

   ╔══════════╦═══════╦═══════╗
   ║ Customer ║ State ║ Entry ║
   ╠══════════╬═══════╬═══════╣
   ║ A        ║ S     ║  5575 ║
   ║ A        ║ S     ║  3215 ║
   ║ B        ║ V     ║  4445 ║
   ║ C        ║ L     ║  NULL ║
   ╚══════════╩═══════╩═══════╝
如果我要执行以下查询:

   SELECT Customer.Customer, Customer.State, Entry.Entry
   FROM Customer
   LEFT JOIN Entry
   ON Customer.Customer=Entry.Customer
   WHERE Entry.Category='D'
这将过滤掉最后一条记录

因此,我需要左表中的所有行,并将其连接到在类别D上筛选的条目表


谢谢你的帮助

您需要将
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'
参见

您还可以执行以下操作:

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
SQL小提琴

SELECT c.Customer, c.State, e.Entry
FROM Customer c
LEFT JOIN Entry e
   ON c.Customer=e.Customer
WHERE e.Category IS NULL or e.Category='D'

哇,你又快又有效率!这就成功了,谢谢你的帮助@TomJenkin谢谢,顺便说一句,你在网站上发布了一个很棒的第一个问题。很多细节,等等。谢谢-我想我会喜欢使用这个网站,希望有一天我能像你一样做出贡献:D@bluefeet但是两个执行计划都是相等的,不是吗?如果where条件指向第一个表,则在联接之前对联接所依赖的表应用筛选。至少在我的一些测试中我看到了这一点。我发表这篇评论是为了回应亚历克斯的评论。@TomJenkin很抱歉反应太晚,我一直都不在电脑旁。不过出于好奇,我运行了这两个程序并检查了执行计划。执行计划几乎相同,但在某种程度上两者都更好,它似乎是BlueFoet的版本。这很好,这启发了我修复我的案例。请参阅此链接,在何处之前执行SQL连接条件。因此,在建议的解决方案中,整个表被联接,结果被过滤——这在处理大型表时可能非常昂贵。预期的过滤条件应是连接条件的一部分,如其他answers@Omley我认为您对SQL的工作原理感到困惑。SQL是声明性的,而不是过程性的。查询中单词的顺序对操作顺序没有影响。这取决于发动机。我们可以从一个简单的
EXPLAIN
中看出,MySql实际上在优化这个查询方面比Taryn的答案中的查询做得稍微好一些,尽管这肯定比管理更幸运,而另一个引擎可能正好相反。