2016-12-26 47 views
0

我想实现某些我认为相当容易的事情,但我无法将其包围。即使在“JOIN”表中没有数据时也选择ID

我有两个表中,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

如果您使用'FULL JOIN',则不使用'MySQL'。 –

+0

正确,它是SQLPlus,为了清晰我删除了标签 – Maxime

回答

0

代替where,使用and

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

完美,谢谢! – Maxime

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仍然是您想要执行的操作的合适连接类型。

相关问题