我有以下表格:
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中选择a中相应的bid/cid-pair的所有行时,我只需使用自然连接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 )Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
ISNULL函数实际上不符合ANSI标准.是的,您需要检查两列中的空值.编写查询的另一种方法是:
Select Distinct b.*
From b
Join a
On ( a.bid = b.bid Or ( a.bid Is Null And b.bid Is Null ) )
And ( a.cid = b.cid Or ( a.cid Is Null And b.cid Is Null ) )
Run Code Online (Sandbox Code Playgroud)
另一种避免使用Distinct的方法:
Select b.*
From b
Where Exists (
Select 1
From a
Where ( a.bid = b.bid Or ( a.bid Is Null And b.bid Is Null ) )
And ( a.cid = b.cid Or ( a.cid Is Null And b.cid Is Null ) )
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15284 次 |
| 最近记录: |