这些查询都会得到结果:
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 join
,left outer join
,right outer join
和full join
。没有返回结果。
我错过了什么?
答案 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}}子句中使用逗号。
如果您的数据库没有返回任何行,那么它的行为是非标准的,或者您的接口已决定出于某种原因过滤行。