Sql 选择在任何记录中不包含特定值的记录
我在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
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;