对 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) 中创建名为“数字”的表?

如何在 python 中定义正在写入 AWS Redshift Postgres DB 的数据的列类型

将字符时间更改为 Postgres 中的日期? [关闭]

传统API管理的“矛”与测试过程之间的“盾”

传统API管理的“矛”与测试过程之间的“盾”

魔兽文本挖掘:我会向沃金复仇向整个暗矛复仇!