此查询仅在没有sort(str, str + strlen(str));
的情况下正常工作,否则会出错:
栏" cnt"不存在
WHERE
答案 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列。见:
postgres真的允许外部聚合函数属性不在分组后面吗?
只有在GROUP BY
子句中列出了PK列(覆盖整行)时才会出现这种情况。 不 UNIQUE
或EXCLUSION
约束的情况。见:
SQL Fiddle demo(Gordon's demo的扩展版本)。