Tôi đang gặp các bảng sau:SQL-Tham gia với NULL-cột
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 | +-------+------------------+------+
Khi tôi muốn chọn tất cả các hàng từ b, nơi có một nỗ lực/cid cặp tương ứng trong một, tôi chỉ cần sử dụng tham gia tự nhiên SELECT b.* FROM b NATURAL JOIN a;
và mọi thứ đều ổn.
Khi a.bid hoặc a.cid là NULL, tôi muốn nhận được mọi hàng có cột khác phù hợp, ví dụ: nếu a.bid là NULL, tôi muốn mỗi hàng nơi a.cid=b.cid
, nếu cả hai là NULL, tôi muốn mỗi cột từ b.
giải pháp ngây thơ của tôi là đây:
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)
Có cách nào tốt hơn để cho điều này?
b.bid và b.cid không thể là Null, do đó, kiểm tra thêm là không cần thiết, nhưng tôi thích ví dụ thứ hai mà không có sự khác biệt. – tstenner
@tstenner - Ah. Đã bỏ lỡ rằng bạn đã nêu các cột trong b là không có giá trị. – Thomas