Ответ 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
У меня есть Join
SELECT * FROM Y
INNER JOIN X ON ISNULL(X.QID, 0) = ISNULL(y.QID, 0)
Isnull
в соединении, как это делает его медленным. Это похоже на условное соединение.
Есть ли какая-нибудь работа над чем-то вроде этого?
У меня много записей, где QID
- Null
У кого-то есть работа, которая не влечет за собой изменения данных
У вас есть две опции
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
Вы намерены использовать синтаксис Inner join?
Если вы не можете использовать этот альтернативный синтаксис:
SELECT *
FROM Y,X
WHERE (X.QID=Y.QID) or (X.QUID is null and Y.QUID is null)
В этой статье есть хорошая дискуссия по этому вопросу. Вы можете использовать
SELECT *
FROM Y
INNER JOIN X ON EXISTS(SELECT X.QID
INTERSECT
SELECT y.QID);
Я уверен, что соединение даже не делает то, что вы хотите. Если в таблице 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
Если вы хотите, чтобы нулевые значения были включены из 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
это правильный способ сделать
В принципе, вы хотите объединить две таблицы вместе, где их столбцы 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`;
Вы также можете использовать функцию coalesce. Я тестировал это в PostgreSQL, но он также должен работать для MySQL или сервер MS SQL.
INNER JOIN x ON coalesce(x.qid, -1) = coalesce(y.qid, -1)
Это заменит NULL
на -1
перед его оценкой. Следовательно, в qid
не должно быть -1
.