对 Redshift/Postgres 中的两个矛盾条件使用 WHERE EXISTS 语句?
Posted
技术标签:
【中文标题】对 Redshift/Postgres 中的两个矛盾条件使用 WHERE EXISTS 语句?【英文标题】:Using a WHERE EXISTS statement for two contradictory conditions in Redshift/Postgres? 【发布时间】:2016-08-30 16:56:52 【问题描述】:我希望编写一个查询,给定一个 ID、名字和姓氏,返回与每个 ID 对应的 ID,该 ID 至少有一行包含名字“Steve”和姓氏“Smith” ,除了至少一行对应于名字“Steve”并且不对应于姓氏“Smith”。我尝试了以下查询,但它返回 0 行。
SELECT DISTINCT id FROM t
WHERE EXISTS (SELECT 1 FROM t WHERE first_name = 'Steve' AND last_name != 'Smith')
AND NOT EXISTS (SELECT 1 FROM t WHERE first_name = 'Steve' AND last_name = 'Smith')
我怀疑这是因为在单行中,这两个条件不能同时为真,即使它们可以在同一 ID 的多行中同时为真。
我应该如何修改或重写此查询以返回感兴趣的 ID?
【问题讨论】:
听起来您想要两个exists
,但您使用了not exists
。但您可能还需要关联您的子查询。
在您的情况下,两个子查询都是不相关的。 (它们不耦合到外部查询)
“不相关”是什么意思?
您的内部查询可能应该说 from t t2 where t2.id = t.id and t2.first_name = 'Steve' ...
您将两者联系在一起,否则这些查询将在整个数据表中运行。
它们与外部查询没有逻辑关系;就像在select id from a where exists (select 1 from b where b.name = 'omg' );
BTW 中一样:在您的情况下,EXISTS() 和 NOT EXISTS() 都可以为真,因为它们从同一个表中选择不同的集合)
【参考方案1】:
显然你可以用另一种方式写这个。给我所有至少有一个 Steve Smith 但并非所有人都是 Steve Smiths 的 ID。
select id
from t
group by id
having count(case when first_name = 'Steve' and last_name = 'Smith' then 1 end)
between 1 and count(last_name) - 1
【讨论】:
以上是关于对 Redshift/Postgres 中的两个矛盾条件使用 WHERE EXISTS 语句?的主要内容,如果未能解决你的问题,请参考以下文章
REDSHIFT:如何生成一系列数字而不在 redshift (Postgres 8.0.2) 中创建名为“数字”的表?