web-dev-qa-db-fra.com

Jointure SQL interne sur des valeurs nulles

J'ai une inscription

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

Isnull dans une jointure comme celle-ci ralentit. C'est comme avoir une jointure conditionnelle. Y a-t-il un travail autour de quelque chose comme ça? J'ai beaucoup d'enregistrements où QID est Null

Tout le monde a une solution qui n'implique pas de modifier les données

37
Rico

Vous avez deux options

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

ou plus facile

INNER JOIN x
  ON x.qid IS NOT DISTINCT FROM y.qid
58
Evan Carroll

Êtes-vous déterminé à utiliser la syntaxe de jointure interne?

Sinon, vous pouvez utiliser cette syntaxe alternative:

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

Cet article a une bonne discussion sur cette question . Vous pouvez utiliser

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

Je suis sûr que la jointure ne fait même pas ce que vous voulez. S'il y a 100 enregistrements dans le tableau a avec un qid nul et 100 enregistrements dans le tableau b avec un qid nul, alors la jointure telle qu'écrite doit faire une jointure croisée et donner 10 000 résultats pour ces enregistrements. Si vous regardez le code suivant et exécutez les exemples, je pense que le dernier est probablement plus l'ensemble de résultats que vous vouliez:

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
3
HLGEM

Si vous souhaitez que les valeurs nulles soient incluses à partir de Y.QID, la méthode la plus rapide est

SELECT * FROM Y LEFT JOIN X ON y.QID = X.QID

Remarque: cette solution n'est applicable que si vous avez besoin de valeurs nulles du tableau de gauche, c'est-à-dire Y (dans le cas ci-dessus).

Autrement INNER JOIN x ON x.qid IS NOT DISTINCT FROM y.qid est la bonne façon de faire

2
ni3nas