Je vais avoir les tableaux suivants:SQL-Join avec des colonnes NULL-
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 | +-------+------------------+------+
Quand je veux sélectionner toutes les lignes de b où il y a une offre/cid paire dans un correspondant, je Il suffit d'utiliser une jointure naturelle SELECT b.* FROM b NATURAL JOIN a;
et tout va bien.
Lorsque a.bid ou a.cid est NULL, je veux obtenir chaque ligne où l'autre colonne correspond, par ex. si a.bid est NULL, je veux chaque ligne où a.cid=b.cid
, si les deux sont NULL, je veux que chaque colonne de b.
Ma solution naïve était ceci:
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)
Y at-il une meilleure façon de ce?
b.bid et b.cid ne peut pas être nul, donc le test supplémentaire est inutile, mais j'aime le second exemple sans distincte. – tstenner
@tstenner - Ah. Vous avez manqué que vous ayez déclaré que les colonnes de b n'étaient pas nulles. – Thomas