У меня есть Соединение
SELECT * FROM Y
INNER JOIN X ON ISNULL(X.QID, 0) = ISNULL(y.QID, 0)
Isnull
в Соединении как это заставляет его замедлиться. Это похоже на наличие условного Соединения. Есть ли какая-либо работа вокруг к чему-то вроде этого? У меня есть много записей где QID
является Пустым
У любого есть работа вокруг этого, не влечет за собой изменение данных
У вас есть два варианта
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
Собираетесь ли вы использовать синтаксис внутреннего соединения?
Если нет, вы можете использовать альтернативный синтаксис:
SELECT *
FROM Y,X
WHERE (X.QID=Y.QID) or (X.QUID is null and Y.QUID is null)
Я почти уверен, что соединение даже не делает то, что вы хотите. Если есть 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
По сути, вы хотите объединить две таблицы, у которых оба столбца 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`;