如果一个raw包含来自另一个表的任何值,则过滤值

时间:2017-07-13 10:01:38

标签: sql hive

我有table1

c1    c2
1   a
1   b
1   c
2   a
3   b

和table2

c3
a
h
y

我需要过滤所有c1,即使c2中的一个包含来自table2的任何c3

结果应该是

c1
3

到目前为止,我试过

with cte as(
select c1, collect_set(c2) as c2
from table1
)

但是我无法以这样的方式加入table2,这样我就可以过滤掉我不需要的原始内容。例如,使用

select c1
from cte 
cross join table2

我可以过滤像

这样的原始内容
1 (a, b, c) a

但不是

1 (a, b, c) x

然后我会得到

2 (a) x

我根本不需要。

我还考虑过结合

select c1, concat_ws(',', c2)

并使用like '%c3%',但c3是一个包含许多值而非某些字符串的列。

NOT EXISTS无法正常工作

有办法吗?

2 个答案:

答案 0 :(得分:2)

我想你想要这样的东西:

select t1.c1
from table1 t1 left join
     table2 t2
     on t1.c2 = t2.c3
group by t1.c1
having count(t2.c3) = 0;

答案 1 :(得分:-1)

请查看戈登的答案,找出更合适,更好的解决方案。

SELECT  [c1]
FROM    @table1
WHERE   [c1] NOT IN ( SELECT    [c1]
                      FROM      @table1
                                INNER JOIN @table2 ON c2 = c3 );