Подтвердить что ты не робот

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

У меня есть Join

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

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

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

4b9b3361

Ответ 1

У вас есть две опции

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

Ответ 2

Вы намерены использовать синтаксис Inner join?

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

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

Ответ 4

Я уверен, что соединение даже не делает то, что вы хотите. Если в таблице a есть 100 записей с нулевым цидом и 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

Ответ 5

Если вы хотите, чтобы нулевые значения были включены из Y.QID, то самым быстрым способом является

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

Примечание. Это решение применимо, только если вам нужны нулевые значения из левой таблицы, то есть Y (в приведенном выше случае).

В противном случае INNER JOIN x ON x.qid IS NOT DISTINCT FROM y.qid это правильный способ сделать

Ответ 6

В принципе, вы хотите объединить две таблицы вместе, где их столбцы QID не равны нулю, правильно? Однако вы не применяете никаких других условий, таких как два значения QID (что кажется мне странным, но хорошо). Что-то простое, как следующее (проверено в MySQL), похоже, делает то, что вы хотите:

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

Это дает вам каждую непустую строку в Y, связанную с каждой непустой строкой в ​​X.

Обновление: Рико говорит, что он также хочет строки со значениями NULL, почему не просто:

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

Ответ 7

Вы также можете использовать функцию coalesce. Я тестировал это в PostgreSQL, но он также должен работать для MySQL или сервер MS SQL.

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

Это заменит NULL на -1 перед его оценкой. Следовательно, в qid не должно быть -1.