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
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
Ê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)
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);
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
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