#sql
#sql
Вопрос:
Я пытаюсь найти все строки из одной таблицы, которые не были скопированы по крайней мере в 1 из 4 других таблиц.
В таблице Title есть столбец с именем titleid . Я хочу быть уверен, что все строки в таблице заголовков скопированы в представление. У нас есть 4 возможных представления. Это может быть в titleView, TitleView2, TitleView3 или TitleView4.
Я пробовал not in, присоединяется к объединениям и существует без удачи. Вот последняя попытка. Это возвращает идентификатор заголовка, которого нет в каждом представлении, вместо того, чтобы рассматривать все 4 как одну гигантскую таблицу.
select ct.titleid
from Title ct
where titleid not in (select distinct titleid from TitleView])
or titleid not in (select distinct titleid from TitleView2])
or titleid not in (select distinct titleid from TitleView3)
or titleid not in (select distinct titleid from TitleView4)
Ответ №1:
Я думаю, вы хотите and
:
select ct.titleid
from Title ct
where titleid not in (select titleid from TitleView]) and
titleid not in (select titleid from TitleView2) and
titleid not in (select titleid from TitleView3) and
titleid not in (select titleid from TitleView4);
Обратите внимание, что select distinct
это не требуется в подзапросе.
Кроме того, я не рекомендую not in
использовать подзапросы. Он не выполняет то, что вы хотите, если какое-либо значение из подзапросов есть NULL
. Кроме того, вы должны указать все ссылки на столбцы. Если один из подзапросов имеет другое имя titleid
, это не делает то, что вы намереваетесь.
Я рекомендую вместо этого:
select ct.titleid
from Title ct
where not exists (select 1 from TitleView v where v.titleid = ct.titleid) and
not exists (select 1 from TitleView2 v where v.titleid = ct.titleid) and
not exists (select 1 from TitleView3 v where v.titleid = ct.titleid) and
not exists (select 1 from TitleView4 v where v.titleid = ct.titleid);