2012-11-26 152 views
0

我做了,我认为应该有相同的结果,两个查询:PostgreSQL的where子句行为

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 COUNT。但结果并不相同。我不明白为什么WHERE子句的位置应该在这种情况下有所作为。谁能解释一下?或者有更好的方法来解释这个问题吗?

+0

即使您的原始严重格式化的帖子也有'AS result2 WHERE table2.value ='1';'在第二个查询中与您的描述不匹配:唯一区别在于SELECT DISTINCT ON中的WHERE子句,另外一个,但在SELECT COUNT内。你能解决你的疑问吗? – mys

+0

我不明白你为什么要求我修复这些查询。如果我知道他们有什么问题,我不会寻求帮助。 – user1625423

+0

你的第二个查询有一个'WHERE'子句,但第一个没有。因此,他们会有不同的结果。 –

回答

0

下面就来看看这一个好办法:

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; 

问题必须做与得天独厚的条件,什么是可见的地方。这是行为设计​​。