在sql中选择另一个表中不存在多列的列

时间:2018-06-06 13:10:01

标签: hive subquery conditional-statements not-exists

我有两个表TABLE1,ID,name和Table2有ID1,ID2和ID3,name1,name2和name3。 我想选择table1.ID中不存在table1.ID: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 :(得分:0)

经过一番研究,我发现this。基本上,IN子句中的NOT INWHERE条件中的子查询不能有多列。这就是您的查询当前失败的原因:您的子查询获取Table2中的所有列。

根据我对您的问题的理解,您需要一个选择,其中结果将是Table2中不存在的元素。

为此,您只需使用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和条件,就像要检查的列一样。

带有此查询概念的

Here's a fiddle(数据不一样,但概念是这样)。

答案 1 :(得分:0)

首先按fetch_table加入,然后按fetch_assoc生成数据集加入,然后按ID1生成数据集加入:

ID2

第2步和第3步的连接将从T1接收已经减少的数据集,这个解决方案可能适用于大表。

答案 2 :(得分:-1)

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