我无法让这个 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 join
、left outer join
、right outer join
和 full 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
子句中使用逗号。
如果您的数据库未返回任何行,则表明它以非标准方式运行,或者您的界面出于某种原因决定过滤行。
这些查询都得到了结果:
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 join
、left outer join
、right outer join
和 full 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
子句中使用逗号。
如果您的数据库未返回任何行,则表明它以非标准方式运行,或者您的界面出于某种原因决定过滤行。