【问题标题】:Using a WHERE EXISTS statement for two contradictory conditions in Redshift/Postgres?对 Redshift/Postgres 中的两个矛盾条件使用 WHERE EXISTS 语句?
【发布时间】: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() 都可以为真,因为它们从同一个表中选择不同的集合)

标签: postgresql amazon-redshift


【解决方案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

【讨论】:

    猜你喜欢
    • 2016-11-24
    • 2011-03-31
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2022-01-25
    相关资源
    最近更新 更多