выбрать столбцы не существует в других таблицах несколько столбцов в SQL - PullRequest
0 голосов
/ 06 июня 2018

У меня есть две таблицы Tables1 с идентификатором, именем, и Table2 имеет ID1, ID2 и ID3, name1, name2 и name3.Я хочу выбрать table1.ID не существует в таблицах 2: ID1, ID2 и ID3

select T1.ID,t1.name
from table1 t1
where  not exists (
   SELECT *
   FROM table2 t2
where t1.ID=t2.ID1  or t1.ID=t2.ID2 or or t1.ID=t2.ID3  )

Я получаю сообщение об ошибке для этого запроса

Ответы [ 3 ]

0 голосов
/ 06 июня 2018
SELECT DISTINCT ID,NAME
FROM
(SELECT T1.ID, T1.name
    FROM Table1 T1
    LEFT OUTER JOIN Table2 T2 ON T2.ID1 = T1.ID
where T2.ID1 is null
union
SELECT T1.ID, T1.name
    FROM Table1 T1
    LEFT OUTER JOIN Table2 T2 ON T2.ID2 = T1.ID
where T2.ID2 is null
union
SELECT T1.ID, T1.name
    FROM Table1 T1
    LEFT OUTER JOIN Table2 T2 ON T2.ID3 = T1.ID
where T2.ID3 is null)JO
0 голосов
/ 06 июня 2018

Соединение сначала ID1, затем объединение набора данных ID2, затем объединение набора данных ID3:

select  p2.ID, p2.name       --pass3
 from
  (select p1.ID, p1.name     --pass2
     from
      (SELECT T1.ID, T1.name --pass1
         FROM Table1 T1
         LEFT JOIN Table2 T2 ON T2.ID1 = T1.ID    
        where T2.ID1 is null                        --not in ID1
      ) p1 LEFT JOIN Table2 T2 ON T2.ID2 = p1.ID 
    where T2.ID1 is null                            --also not in ID2
  ) p2 LEFT JOIN Table2 T2 ON T2.ID3 = p2.ID
where T2.ID1 is null                                --also not in ID3

Соединения на 2 и 3 шагах получат уже сокращенный набор данных от T1и это решение может быть хорошо для больших столов.

0 голосов
/ 06 июня 2018

После небольшого исследования я смог найти это .По сути, вы не можете иметь несколько столбцов для подзапроса в условии IN или NOT IN в предложении WHERE.Вот почему ваш запрос в настоящее время терпит неудачу: Ваш подзапрос получает все столбцы из Таблицы 2.


Насколько я понимаю, ваш вопрос, вы хотите выбрать, где результатом будут элементы, которые не существуют вТаблица 2.

Для этого вы можете просто использовать LEFT OUTER JOIN.В SQL я бы оставил объединение во всех трех столбцах, но похоже, что Hive не поддерживает несколько условий в JOIN операторах, поэтому вы можете использовать следующую альтернативу:

SELECT T1.ID, T1.name
    FROM Table1 T1
    LEFT JOIN Table2 T2_1 ON T2_1.ID1 = T1.ID
    LEFT JOIN Table2 T2_2 ON T2_2.ID2 = T1.ID
    WHERE (T2_1.id IS NULL) AND                  -- the id of Table2 - T2_1    
          (T2_2.id IS NULL)                      -- the id of Table2 - T2_2

Просто добавьте столько LEFT JOIN и условия в предложении WHERE, поскольку у вас есть столбцы для проверки.

Вот скрипка с этой концепцией запроса (данные не совпадают, но концепция есть).

...