我无法让这个左加入工作(我不明白连接)



这些查询都会得到结果:

SELECT * FROM Table1 WHERE Criteria = '5'
SELECT * FROM Table1 WHERE Criteria = '3'

此查询得到结果:

SELECT *
FROM Table1 p, Table2 m
WHERE p.UID = m.ID
AND Criteria = '5'

此查询不会:

SELECT *
FROM Table1 p, Table2 m
WHERE p.UID = m.ID
AND Criteria = '3'

我正在尝试将这些转换为一个适当的联接,即使在正确的表中没有记录,它也会返回结果。

我试过以下

SELECT *
FROM Table1 p LEFT JOIN Table2 m ON p.UID = m.ID
WHERE p.Criteria = '3'
AND m.OtherCriteria = 'Moron'
--0 results

我有限的理解是,LEFT加入是我所需要的。我想要表中的数据,即使中没有匹配的数据。由于这不起作用,我还尝试了right joinleft outer joinright outer joinfull join。无返回结果。

我错过了什么?

这对于注释来说太长了。您的查询:

SELECT *
FROM Table1 p LEFT JOIN
     Table2 m
     ON p.UID = m.ID AND p.Criteria = '3';

应该为table1中的所有行返回一行。如果不匹配,则table2的值将为NULL。这一点很容易演示:下面是一个关于SQLFiddle的MySQL示例。因为这是标准行为,所以它应该适用于几乎任何数据库。

请注意,此查询与以下查询大不相同:

SELECT *
FROM Table1 p LEFT JOIN
     Table2 m
     ON p.UID = m.ID 
WHERE p.Criteria = '3';

此查询不返回任何行,因为没有任何行与WHERE子句匹配。过滤(概念上)发生在LEFT JOIN之后。

我稍微更改了SQL Fiddle中的代码,因此查询为:

select *
from (select 5 as criteria, 1 as id union all
      select 6, 1 union all
      select 7, 2
     ) table1 left join
     (select 1 as id, 'x' as x
     ) table2
     on table1.id = table2.id and criteria = 3;

注意:您应该始终使用明确的join语法。简单规则:在FROM子句中永远不要使用逗号。

如果您的数据库没有返回任何行,那么它的行为是非标准的,或者您的接口出于某种原因决定过滤这些行。

相关内容

最新更新