Внутреннее объединение SQL на нулевых значениях

У меня есть Соединение

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

Isnull в Соединении как это заставляет его замедлиться. Это похоже на наличие условного Соединения. Есть ли какая-либо работа вокруг к чему-то вроде этого? У меня есть много записей где QID является Пустым

У любого есть работа вокруг этого, не влечет за собой изменение данных

37
задан John Saunders 31 October 2013 в 18:03
поделиться

4 ответа

У вас есть два варианта

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
58
ответ дан 27 November 2019 в 04:35
поделиться

Собираетесь ли вы использовать синтаксис внутреннего соединения?

Если нет, вы можете использовать альтернативный синтаксис:

SELECT * 
FROM Y,X
WHERE (X.QID=Y.QID) or (X.QUID is null and Y.QUID is null)
7
ответ дан 27 November 2019 в 04:35
поделиться

Я почти уверен, что соединение даже не делает то, что вы хотите. Если есть 100 записей в таблице a с нулевым qid и 100 записей в таблице b с нулевым 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
3
ответ дан 27 November 2019 в 04:35
поделиться

По сути, вы хотите объединить две таблицы, у которых оба столбца QID не равны нулю, верно? Однако вы не применяете никаких других условий, таких как два значения 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`;
-1
ответ дан 27 November 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: