带有 NULL 列的 SQL 连接
我有以下表格:
表 a
字段 | 类型 | Null | Key |
---|---|---|---|
bid | int(10) unsigned | YES | |
cid | int(10) unsigned | YES |
表 b
字段 | 类型 | Null |
---|---|---|
bid | int(10) unsigned | NO |
cid | int(10) unsigned | NO |
data | int( 10) unsigned | NO |
当我想从 b 中选择 a 中存在相应 bid/cid 对的所有行时,我只需使用自然连接 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)
有没有更好的方法呢?
I'm having the following tables:
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 |
When I want to select all rows from b where there's a corresponding bid/cid-pair in a, I simply use a natural join SELECT b.* FROM b NATURAL JOIN a;
and everything is fine.
When a.bid
or a.cid
is NULL
, I want to get every row where the other column matches, e.g. if a.bid
is NULL
, I want every row where a.cid = b.cid
, if both are NULL
I want every column from b
.
My naive solution was this:
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)
Is there any better way to to this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
ISNULL 函数实际上不符合 ANSI 标准。是的,您确实需要检查两列中是否有空值。编写查询的另一种方法是:
另一种避免使用 Distinct 的方法:
The ISNULL function is not actually ANSI compliant. Yes, you do need to check for nulls in both columns. Another way to write your query would be:
Yet another way that avoids the use of Distinct:
不,差不多就是这样了。
(为了符合 ANSI SQL FWIW,我通常将
ISNULL(a.bind)
改写为a.bind IS NULL
。)No, that's pretty much it.
(I'd generally rephrase
ISNULL(a.bind)
asa.bind IS NULL
for ANSI SQL compliance FWIW.)太旧了,但这是我的 2 美分,它可能对某人有用:
Too old, but here is my 2 cents, it might be useful for someone: