ich die folgenden Tabellen habe:SQL-Join mit NULL-Spalten
Table a +-------+------------------+------+-----+ | Field | Type | Null | Key | +-------+------------------+------+-----+ | bid | int(10) unsigned | YES | | | cid | int(10) unsigned | YES | | +-------+------------------+------+-----+
Table b +-------+------------------+------+ | Field | Type | Null | +-------+------------------+------+ | bid | int(10) unsigned | NO | | cid | int(10) unsigned | NO | | data | int(10) unsigned | NO | +-------+------------------+------+
Wenn ich möchte alle Zeilen auszuwählen, aus b, wo gibt es ein entsprechendes Angebot/cid-Paar in a, I Verwenden Sie einfach eine natürliche Verbindung SELECT b.* FROM b NATURAL JOIN a;
und alles ist in Ordnung.
Wenn a.bid oder a.cid NULL ist, möchte ich jede Zeile erhalten, wo die andere Spalte übereinstimmt, z. Wenn a.bid NULL ist, möchte ich jede Zeile a.cid=b.cid
, wenn beide NULL sind Ich möchte jede Spalte von b.
Meine naive Lösung war:
SELECT DISTINCT b.* FROM b JOIN a ON (ISNULL(a.bid) OR a.bid=b.bid) AND (ISNULL(a.cid) OR a.cid=b.cid)
Gibt es einen besseren Weg, dies zu?
b.bid und b.cid kann nicht Null sein, also ist der extra test unnötig, aber ich mag das zweite beispiel ohne distinct. – tstenner
@ tstenner - Ah. Sie haben verpasst, dass Sie die Spalten in b als Nicht-Nullwert angegeben haben. – Thomas