postgresql where子句行为

postgresql where子句行为,postgresql,Postgresql,我提出了两个我认为应该有相同结果的问题: 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')

我提出了两个我认为应该有相同结果的问题:

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';

唯一的区别是一个在SELECT DISTINCT ON内有WHERE子句,另一个在该子句外,但在SELECT COUNT内。但结果却不一样。我不明白为什么WHERE子句的位置在这种情况下会有所不同。有人能解释一下吗?还是有更好的方法来表达这个问题?

这里有一个很好的方法来看待这个问题:

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;

问题与独特的条件以及在哪里可以看到什么有关。这是设计的行为。

即使是你原来格式不好的帖子也有
作为结果2,其中table2.value='1'与您的描述不匹配:唯一的区别是其中一个在SELECT DISTINCT ON内有WHERE子句,另一个在该子句外,但在SELECT COUNT内。你能修正你的疑问吗?我不明白你为什么要我修正这些疑问。如果我知道他们出了什么问题,我就不会寻求帮助。你的第二个查询有一个
WHERE
子句,但第一个没有。因此,它们会有不同的结果。如果你仔细观察,你会发现它们都有WHERE子句。我的问题是为什么WHERE的位置会有不同。@user1625423因为那个些查询根本不起作用<代码>选择不同的
引用
表1
表2
,但
表1
表2
不存在--表名为
result1
。第二个查询以相同的方式被破坏。此外,
table2
(在
中,其中table2.value='1';
)不存在,应将其引用为
result2