2016-12-26 5 views
0

Ich möchte etwas erreichen, von dem ich glaube, dass es ziemlich einfach ist, aber ich kann mich nicht damit abfinden.Wählen Sie IDs, auch wenn keine Daten in einer 'JOIN'ed-Tabelle vorhanden sind.

Ich habe zwei Tabellen, A und B:

Tabelle A ist, wo alle Elemente definiert sind.

In Tabelle B sind einige optionale Eigenschaften gespeichert, aber nicht alle Datensätze in dieser Tabelle.

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

Wenn ich abfragen, diese Tabellen verwenden:

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

I

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

Aber ich möchte alle Zeilen in der Tabelle A bekommen, auch wenn sie nicht ein 'prop2'-Wert, etwas wie

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

Wie kann ich meine Abfrage optimieren, um die letztere zu bekommen (ich denke, dass es mit den JOIN-Schlüsselwörtern zu tun hat, aber egal wie viele Tutorials ich lese, kann ich es nicht funktionieren lassen ...)

Vielen Dank !

+2

Sie verwenden 'MySQL' nicht, wenn Sie' FULL JOIN' verwenden. –

+0

Richtig, es ist SQLPlus, ich entfernte das Tag für Klarheit – Maxime

Antwort

0

statt where verwenden and:

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

Perfekt, danke! – Maxime

0

Sie brauchen nur einen LEFT JOIN dafür. Der Schlüssel ist die WHERE Bedingung in der ON Klausel zu setzen:

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

A LEFT JOIN hält alle Zeilen in der ersten Tabelle, auch wenn es keine passenden Zeilen in den zweiten sind. Die Werte der Spalten in der zweiten Tabelle sind dann jedoch NULL, sodass die Klausel WHERE sie ausfiltert. Wie ich im Kommentar bemerke, unterstützt MySQL FULL OUTER JOIN nicht. Die meisten Datenbanken tun das, aber LEFT JOIN ist immer noch der geeignete Join-Typ für das, was Sie tun möchten.

Verwandte Themen