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