我不能让这个LEFT JOIN工作(我不明白加入)

时间:2015-12-04 21:45:16

标签: sql join intersystems-cache

这些查询都会得到结果:

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 表中没有匹配的数据,我也希望来自 left 表的数据。由于这不起作用,我还尝试了right joinleft outer joinright outer joinfull join。没有返回结果。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

评论太长了。您的查询:

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

应为table1中的所有行返回一行。如果没有匹配项,那么NULL的值将为table2。这很容易证明:Here是SQL Fiddle的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语法。简单规则:切勿在{{1​​}}子句中使用逗号。

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