我有两个表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 )
我收到此查询的错误消息
答案 0 :(得分:0)
经过一番研究,我发现this。基本上,IN
子句中的NOT IN
或WHERE
条件中的子查询不能有多列。这就是您的查询当前失败的原因:您的子查询获取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