Возвращает любые строки, где идентификатор в одной таблице не соответствует 1 из 4 других таблиц

#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);