Tom*_*aff 3 sql presto amazon-athena
我有一个以下形式的查询:
SELECT DISTINCT person_id
FROM my_table
WHERE person_id NOT IN (SELECT person_id FROM my_table WHERE status = 'hungry')
Run Code Online (Sandbox Code Playgroud)
每个人都有my_table多行,我想排除那些曾经处于“饥饿”状态的人。这是我认为标准的构造,并在其他 SQL 方言中使用过,但这在 Athena 中返回了一个空结果集。
另一方面,普通的旧IN建筑却按预期进行。
谁能解释一下如何在 Presto 中编写这个查询?我发现另一篇关于 SO 的文章似乎暗示它工作正常,所以我有点困惑。
不使用NOT IN。如果有任何返回值,NULL则它不返回任何行。注意:这就是 SQL 的工作原理,而不是任何特定数据库的特性。
相反,使用NOT EXISTS:
SELECT DISTINCT t.person_id
FROM my_table t
WHERE NOT EXISTS (SELECT
FROM my_table t2
WHERE t2.status = 'hungry' AND
t2.person_id = t.person_id
);
Run Code Online (Sandbox Code Playgroud)
实际上,我可能建议为此进行聚合——您基本上已经在使用以下方法进行聚合SELECT DISTINCT:
select person_id
from my_table t
group by person_id
having sum(case when status = 'hungry' then 1 else 0 end) = 0;
Run Code Online (Sandbox Code Playgroud)