从另一个表中按计数过滤

时间:2017-10-14 13:58:48

标签: sql postgresql join count aggregate-functions

此查询仅在没有sort(str, str + strlen(str)); 的情况下正常工作,否则会出错:

  

栏" cnt"不存在

WHERE

2 个答案:

答案 0 :(得分:3)

使用子查询:

SELECT a.*
FROM (SELECT A.*,
             (SELECT count(*)
              FROM B
              WHERE A.id = B.id
             ) AS cnt
      FROM A
     ) a
WHERE cnt > 0;

SELECT WHERE中定义的列别名不能被SELECT(或其他子句)用于a

或者,如果SELECT a.*, COUNT(B.id) FROM A LEFT JOIN B ON A.id = B.id GROUP BY A.id HAVING COUNT(B.id) > 0; 上的ID是唯一的,您可以更简单地执行:

select a.*
from a
where exists (select 1 from b where b.id = a.id);

或者,如果你真的不需要计数,那么:

string1 aze string2 eza string3 aze string4 eza string5

答案 1 :(得分:2)

假设:

  • 您需要结果中A的所有列以及B的计数。这就是您所演示的查询的作用。

  • 您只需要cnt > 0行。这毕竟是你的问题所在。

  • B.id中存在大部分或全部A。这是典型案例,如果B.id上的FK约束引用A.id,则肯定是正确的。

解决方案

更快,更短,更正:

SELECT *  -- !
FROM  (SELECT id, count(*) AS cnt FROM B) B
JOIN   A USING (id)  -- !
-- WHERE cnt > 0 -- this predicate is implicit now!

重点

  • 在加入之前聚合,在处理整个表格或其主要部分时,通常(基本上)更快。如果您加入多个 n -table,它还可以防止出现问题。参见:

  • 您不再需要添加谓词WHERE cnt > 0,而是隐含[INNER] JOIN

  • 您可以简单地编写SELECT *,因为在完成cnt子句时,连接只会将列A.*添加到USING - 只有一个实例加入列(示例中的id)将添加到out列。见:

您添加的question in the comment

  

postgres真的允许外部聚合函数属性不在分组后面吗?

只有在GROUP BY子句中列出了PK列(覆盖整行)时才会出现这种情况。 UNIQUEEXCLUSION约束的情况。见:

SQL Fiddle demoGordon's demo的扩展版本)。