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

I cannot get this LEFT JOIN to work (I don't understand joins)

这些查询都得到了结果:

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'

我正在尝试将这些转换为正确的联接,即使右侧 table.

中没有记录,也会产生 returns 结果

我试过以下方法

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

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

我错过了什么?

评论太长了。您的查询:

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

应该为 table1 中的所有行返回一行。如果没有匹配项,则值将为 NULL for table2。这很容易证明:Here 是 SQL Fiddle 上的 MySQL 示例。因为这是标准行为,所以它应该适用于几乎所有数据库。

请注意,此查询与此查询有很大不同:

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

这个查询 returns 没有行,因为没有行匹配 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 子句中使用逗号。

如果您的数据库未返回任何行,则表明它以非标准方式运行,或者您的界面出于某种原因决定过滤行。