SQL Server 空值上的SQL内部连接

aelbi1ox  于 2022-12-26  发布在  其他
关注(0)|答案(8)|浏览(222)

我有一个加入

SELECT * FROM Y
INNER JOIN X ON ISNULL(X.QID, 0) = ISNULL(y.QID, 0)

Isnull在这样的连接中会使速度变慢。这就像有条件连接一样。是否有解决此类问题的方法?我有很多QID为Null的记录
任何人都有不需要修改数据的解决方案

x9ybnkn6

x9ybnkn61#

你有两个选择

INNER JOIN x
   ON x.qid = y.qid OR (x.qid IS NULL AND y.qid IS NULL)

或者更容易

INNER JOIN x
  ON x.qid IS NOT DISTINCT FROM y.qid
x759pob2

x759pob22#

如果要从Y.QID中包含空值,则最快的方法是
第一个月
注:此解决方案仅适用于需要左表中的空值,即Y(上例中)。
否则INNER JOIN x ON x.qid IS NOT DISTINCT FROM y.qid是正确的方法

fivyi3re

fivyi3re3#

This article has a good discussion on this issue。您可以使用

SELECT * 
FROM Y
INNER JOIN X ON EXISTS(SELECT X.QID 
                       INTERSECT 
                       SELECT y.QID);
v1l68za4

v1l68za44#

您是否承诺使用内部连接语法?
如果没有,您可以使用以下替代语法:

SELECT * 
FROM Y,X
WHERE (X.QID=Y.QID) or (X.QUID is null and Y.QUID is null)
lsmepo6l

lsmepo6l5#

我敢肯定这个连接并没有达到你想要的效果。如果表a中有100条记录的qid为空,表b中有100条记录的qid为空,那么这个连接应该是一个交叉连接,并为这些记录给予10,000个结果。如果你看一下下面的代码并运行这些示例,我认为最后一个可能更符合你的预期:

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
nsc4cvqm

nsc4cvqm6#

嘿,现在回答这个问题有点晚了,但我也有同样的问题,我意识到第二个表中必须有一个ID为0的记录才能进行此操作:

SELECT * FROM Y
INNER JOIN X ON ISNULL(Y.QID, 0) = ISNULL(X.QID, 0)

它实际上是if there is none, then use 0但是如果Y没有ID为0的记录,该怎么办?
所以,我找到了这个方法,(并为我的情况下工作):

SELECT 
  ISNULL(Y.QName, 'ThereIsNone') AS YTableQName
FROM
  X
LEFT OUTER JOIN Y ON X.QID = Y.QID

A snapshot of my case
这样,您需要第二个表中ID值为0的记录(在本例中为Y,在我的例子中为Customers),或者任何记录

    • 更新**:

你也可以看一下this post来更好的理解。

eaf3rand

eaf3rand7#

基本上,您希望将QID列都为 not null的两个表连接在一起,对吗?但是,您没有强制执行任何其他条件,例如两个QID值(这对我来说似乎很奇怪,但没关系)。像下面这样简单的东西(在MySQL中测试)似乎可以满足您的需要:

SELECT * FROM `Y` INNER JOIN `X` ON (`Y`.`QID` IS NOT NULL AND `X`.`QID` IS NOT NULL);

这样,Y中的每个非空行都连接到X中的每个非空行。

**更新:**Rico说他还需要NULL值的行,为什么不:

SELECT * FROM `Y` INNER JOIN `X`;
0lvr5msh

0lvr5msh8#

您还可以使用coalesce函数,我在PostgreSQL中测试了这个函数,但它也应该可以用于MySQL或MS SQL server

INNER JOIN x ON coalesce(x.qid, -1) = coalesce(y.qid, -1)

这将在计算之前用-1替换NULL。因此qid中不能有-1

相关问题