【问题标题】:postgresql where clause behaviorpostgresql where 子句行为
【发布时间】:2012-11-26 06:49:19
【问题描述】:

我做了两个我认为应该有相同结果的查询:

SELECT COUNT(*) FROM (
    SELECT DISTINCT ON (id1) id1, value 
    FROM (
        SELECT table1.id1, table2.value 
            FROM table1 
            JOIN table2 ON table1.id1=table2.id 
            WHERE table2.value = '1') 
    AS result1 ORDER BY id1) 
AS result2;

SELECT COUNT(*) FROM (
    SELECT DISTINCT ON (id1) id1, value 
    FROM (
        SELECT table1.id1, table2.value 
        FROM table1 
        JOIN table2 ON table1.id1=table2.id 
    ) 
    AS result1 ORDER BY id1) 
AS result2
WHERE value = '1';

唯一的区别是一个 WHERE 子句在 SELECT DISTINCT ON 内,另一个在 SELECT DISTINCT ON 之外,但在 SELECT COUNT 内。但结果并不相同。我不明白为什么 WHERE 子句的位置在这种情况下会有所不同。谁能解释一下?或者有没有更好的方式来表达这个问题?

【问题讨论】:

  • 即使你原来的格式错误的帖子在第二个查询中也有AS result2 WHERE table2.value = '1';,这与你的描述不匹配:唯一的区别是一个在 SELECT DISTINCT ON 内有 WHERE 子句,另一个在外面那个,但是在 SELECT COUNT 里面。你能解决你的问题吗?
  • 我不明白您为什么要我修复查询。如果我知道他们出了什么问题,我就不会寻求帮助了。
  • 您的第二个查询有一个WHERE 子句,但第一个没有。因此,它们会产生不同的结果。
  • 如果您仔细观察,您会发现它们都有 WHERE 子句。我的问题是为什么 WHERE 的位置会有所不同。
  • @user1625423 因为这些查询不起作用。 select distinct 指的是table1table2,但table1table2 不存在——表名为result1。第二个查询以同样的方式被破坏。此外,table2(在WHERE table2.value = '1';中)不存在,应引用为result2

标签: postgresql


【解决方案1】:

这是一个很好的方法:

SELECT DISTINCT ON (id) id, value
  FROM (select 1 as id, 1 as value
        union
        select 1 as id, 2 as value) a;

SELECT DISTINCT ON (id) id, value
  FROM (select 1 as id, 1 as value
        union
        select 1 as id, 2 as value) a
 WHERE value = 2;

问题与独特的条件和可见的地方有关。这是设计的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 2020-04-28
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2023-01-21
    • 2018-11-12
    相关资源
    最近更新 更多