我知道在使用group-by-clause的查询中,只能选择group-by-clause或使用聚合函数中的列。但在我下面的例子中,它是有效的(project_name列(。我想知道其中的逻辑。这在什么条件下有效?
项目表
id | 名称 | xxxxx |
---|---|---|
p001 | ML1 | -------- |
p002 | AI2 | --------[/tr>
Postgres实现了ANSI-92 SQL标准中定义的这种行为。当通过唯一列进行聚合时,也可以选择任何其他列,因为这些列在功能上依赖于GROUP BY
子句中出现的唯一列。换句话说,如果我们知道project
表中记录的id
值,那么我们也就知道该表中任何其他列的值。因此,在您的查询中,只通过项目id
进行聚合是合法的,但也可以选择名称。
但是,在其他一些数据库(如Oracle和SQL Server(上,不支持这种行为。在那里,您必须使用以下版本的查询:
SELECT proj.id, proj.name, COUNT(*) AS count_user
FROM project proj
INNER JOIN uer_liked_projects ulp
ON proj.id = ulp.project_id
GROUP BY proj.id, proj.name;
在这里,我们需要将name
列添加到GROUP BY
子句中,以获得要编译的代码。