create table #test1 (id int identity, qid int)
create table #test2 (id int identity, qid int)
Insert #test1 (qid)
select null
union all
select null
union all
select 1
union all
select 2
union all
select null
Insert #test2 (qid)
select null
union all
select null
union all
select 1
union all
select 3
union all
select null
select * from #test2 t2
join #test1 t1 on t2.qid = t1.qid
select * from #test2 t2
join #test1 t1 on isnull(t2.qid, 0) = isnull(t1.qid, 0)
select * from #test2 t2
join #test1 t1 on
t1.qid = t2.qid OR ( t1.qid IS NULL AND t2.qid IS NULL )
select t2.id, t2.qid, t1.id, t1.qid from #test2 t2
join #test1 t1 on t2.qid = t1.qid
union all
select null, null,id, qid from #test1 where qid is null
union all
select id, qid, null, null from #test2 where qid is null
8条答案
按热度按时间x9ybnkn61#
你有两个选择
或者更容易
x759pob22#
如果要从Y.QID中包含空值,则最快的方法是
第一个月
注:此解决方案仅适用于需要左表中的空值,即Y(上例中)。
否则
INNER JOIN x ON x.qid IS NOT DISTINCT FROM y.qid
是正确的方法fivyi3re3#
This article has a good discussion on this issue。您可以使用
v1l68za44#
您是否承诺使用内部连接语法?
如果没有,您可以使用以下替代语法:
lsmepo6l5#
我敢肯定这个连接并没有达到你想要的效果。如果表a中有100条记录的qid为空,表b中有100条记录的qid为空,那么这个连接应该是一个交叉连接,并为这些记录给予10,000个结果。如果你看一下下面的代码并运行这些示例,我认为最后一个可能更符合你的预期:
nsc4cvqm6#
嘿,现在回答这个问题有点晚了,但我也有同样的问题,我意识到第二个表中必须有一个ID为
0
的记录才能进行此操作:它实际上是
if there is none, then use 0
。但是如果Y
表没有ID为0
的记录,该怎么办?所以,我找到了这个方法,(并为我的情况下工作):
A snapshot of my case
这样,您不需要第二个表中ID值为
0
的记录(在本例中为Y
,在我的例子中为Customers
),或者任何记录你也可以看一下this post来更好的理解。
eaf3rand7#
基本上,您希望将QID列都为 not null的两个表连接在一起,对吗?但是,您没有强制执行任何其他条件,例如两个QID值(这对我来说似乎很奇怪,但没关系)。像下面这样简单的东西(在MySQL中测试)似乎可以满足您的需要:
这样,Y中的每个非空行都连接到X中的每个非空行。
**更新:**Rico说他还需要NULL值的行,为什么不:
0lvr5msh8#
您还可以使用coalesce函数,我在PostgreSQL中测试了这个函数,但它也应该可以用于MySQL或MS SQL server。
这将在计算之前用
-1
替换NULL
。因此qid
中不能有-1
。