即使“JOIN”表

时间:2016-12-26 13:18:37

标签: sql join

我想做一些我认为相当容易的事情,但我无法绕过它。

我有两张桌子,A和B:

表A是定义所有项目的地方。

+----+--------------+
+ ID + other_things +
+----+--------------+
+ 1  + ~~~~~~~~~~~~ +
+ 2  + ~~~~~~~~~~~~ +
+ 3  + ~~~~~~~~~~~~ +
+----+--------------+

在表B中,存储了一些可选属性,但并未存储此表中的所有记录。

+----+-------------+-------------+
+ ID + prop_type   +  prop_value +
+----+-------------+-------------+
+ 1  +    prop1    +   foo       +
+----+-------------+-------------+
+ 1  +    prop2    +   toto      +
+----+-------------+-------------+
+ 3  +    prop2    +  lorem      +
+----+-------------+-------------+  

当我查询这些表时,使用:

SELECT A.ID, B.prop_value FROM A FULL JOIN B ON A.ID = B.ID WHERE B.prop_type = 'prop2'

我得到了

ID                       prop_value
------------------------ -------------------------------------------------------
1                        toto
3                        lorem

但是我想获得表A中的所有行,即使它们没有'prop2'值,例如

ID                       prop_value
------------------------ -------------------------------------------------------
1                        toto
2                   
3                        lorem

如何调整我的查询以获取后者(我认为它与JOIN关键字有关,但无论我阅读了多少教程,我都无法使其工作......)

非常感谢!

2 个答案:

答案 0 :(得分:0)

而不是where,请使用and

SELECT A.ID, B.prop_value FROM A FULL JOIN B ON A.ID = B.ID and B.prop_type = 'prop2'

答案 1 :(得分:0)

您只需LEFT JOIN即可。关键是将WHERE条件放在ON子句中:

SELECT A.ID, B.prop_value
FROM A LEFT JOIN
     B
     ON A.ID = B.ID AND B.prop_type = 'prop2';

LEFT JOIN保留第一个表中的所有行,即使第二个表中没有匹配的行也是如此。但是,第二个表中的列值为NULL,因此WHERE子句会将其过滤掉。

正如我在评论中指出的那样,MySQL不支持FULL OUTER JOIN。大多数数据库都可以,但LEFT JOIN仍然是您想要做的适当的连接类型。