【问题标题】:LEFT OUTER JOIN query not returning expected rowsLEFT OUTER JOIN 查询未返回预期的行
【发布时间】:2013-02-13 19:56:38
【问题描述】:

我的目标是完全按照 LEFT OUTER JOIN 的意图使用第四个维恩图:SQL Diagrams

我的查询根本没有返回任何值,实际上,它应该返回 Consultant_Memberships 中的所有值减去存储在 Consultant_Memberships_Lists 中的值。

请查看SQL Fiddle 以便于理解:

SELECT * 
FROM   consultant_memberships 
       LEFT OUTER JOIN consultant_memberships_list 
                    ON consultant_memberships.`id` = 
                       consultant_memberships_list.membership_id 
WHERE  consultant_memberships_list.consultant_id = $id 
       AND consultant_memberships_list.membership_id IS NULL 

该查询使用“5”作为 ID 进行演示,以尝试挑选正确的行。

【问题讨论】:

  • 目前您的问题几乎没有信息,只有其他地方的信息链接。这些链接很好,但您的问题也应该包含必要的信息。
  • (另外,你的措辞——“事实上,[我的查询]应该是 [...]”——听起来你认为你已经正确地编写了查询,并且 DBMS只是运行错误。我向你保证,情况并非如此。)
  • (我同意ruakh。我将标题中的“正确”改为“预期”,并鼓励使用中性/非指责性语言。)
  • 抱歉,我已经添加了更多信息。

标签: mysql left-join sqlfiddle


【解决方案1】:

由于WHERE 子句中的consultant_id = 5,您当前的查询基本上是在执行INNER JOIN。我相信您实际上想使用:

SELECT * 
FROM   consultant_memberships m
LEFT OUTER JOIN consultant_memberships_list l
  ON m.`id` = l.membership_id 
  AND l.consultant_id = 5 
WHERE l.membership_id IS NULL;

SQL Fiddle with Demo

【讨论】:

  • @Bluefeet - 它工作得很好,我在这个过程中学到了更多的 LEFT OUTER JOIN。谢谢你的帮助,我很感激。
  • +1 WHERE 子句中的谓词否定了 LEFT JOIN 的“外部”特性。对我来说,考虑 OUTER 连接的最简单方法是:如果找不到匹配的行,则会生成一个虚拟行,以便返回匹配的行。生成的虚拟行将完全由 NULL 值组成。因此,WHERE 子句中的任何“IS NOT NULL”谓词都将排除所有生成的虚拟行。
【解决方案2】:

使用

SELECT * 
   FROM   consultant_memberships 
       LEFT  Outer JOIN consultant_memberships_list 
                ON consultant_memberships_list.membership_id = consultant_memberships.`id`  
                and  consultant_memberships_list.consultant_id = 5 
 where  consultant_memberships_list.membership_id IS NULL;

之前在查询“consultant_memberships_list.consultant_id = 5”中使用的 Where 子句忽略了左外连接。

【讨论】:

  • 如果您提及您对查询所做的更改(即将谓词从 WHERE 子句移动到 ON 子句)并提及为什么需要进行更改,这可能会更有帮助。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多