Sql 选择在任何记录中不包含特定值的记录

Sql 选择在任何记录中不包含特定值的记录,sql,select,hive,Sql,Select,Hive,我在SQL方面面临困难。我有账号和计划。我想知道所有没有参加某项计划的人 acct plans 1 planA 1 planB 2 planA 3 planC 4 planD 我需要那些没有参加planA的人。我目前的查询是: select * from table where plans <> 'planA' 从计划“planA”所在的表中选择* 但我也得到了acct 1,因为这一行有planB。我只需要帐户3

我在SQL方面面临困难。我有账号和计划。我想知道所有没有参加某项计划的人

acct  plans  
1     planA  
1     planB  
2     planA  
3     planC  
4     planD  
我需要那些没有参加planA的人。我目前的查询是:

select * from table where plans <> 'planA'
从计划“planA”所在的表中选择*
但我也得到了acct 1,因为这一行有planB。我只需要帐户3,4作为输出。

试试看


显而易见的解决方案是使用自连接。联接是代价高昂的操作。你可以尝试另一种方法

SELECT acct, 
       SUM(CASE WHEN plans='planA' THEN 1 ELSE 0 END) AS hasPlanA
  FROM tbl
 GROUP BY acct
HAVING hasPlanA = 0

通过上面的陈述,您实际上是在计算客户订阅planA的次数。
HAVING
子句仅过滤planA订阅为零的结果。

这是另一个可能的查询,用于构建计划列表,成员已订阅并检查planA是否不在该列表中-

with temptable as 
( 
  select acct,collect_list(plans) as plan_list
  from plantable
  group by acct
)
select * from temptable  
where array_contains(plan_list,'planA') = false;

谢谢stephan..子查询在配置单元中不起作用。只有您可以在子查询中传递值,但不能在查询中传递值?未尝试,但doku表示,允许从hive 0.13上使用
不在
中以及不相关的子查询。()
with temptable as 
( 
  select acct,collect_list(plans) as plan_list
  from plantable
  group by acct
)
select * from temptable  
where array_contains(plan_list,'planA') = false;