У меня есть следующие таблицы:
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 |
+-------+------------------+------+
Когда я хочу выбрать все строки из b, в которых есть соответствующая пара bid / cid в a, я просто использую естественное соединение SELECT b.* FROM b NATURAL JOIN a;
, и все в порядке.
Когда a.bid или a.cid имеет значение NULL, я хочу получить каждую строку, где совпадает другой столбец, например если a.bid имеет значение NULL, я хочу, чтобы каждая строка была a.cid=b.cid
, если оба имеют значение NULL, я хочу каждый столбец из b.
Мое наивное решение было таким:
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 )
Есть ли лучший способ сделать это?