2016-12-26 74 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仍然是您想要執行的操作的合適連接類型。

相關問題