sql - 您可以按未在 SQL 中选择的列分组吗

标签 sql postgresql group-by

我正在做一个过去的纸质问题。数据库模式是:

  • 客户(客户 ID、姓名、地址、邮政编码),
  • 订单(orderID,customerID REFERENCES Customer.customerID,orderDate, 送货地址)

我需要选择每个客户的订单数量以及客户的姓名,按订单数量从多到少排序。

我有以下查询:

SELECT COUNT(orderID) AS orders_placed, name
FROM Customer INNER JOIN
     Orders 
     ON Orders.customerID = Customer.customerID
GROUP BY Customer.customerID
ORDER BY orders_placed DESC;

我的问题是这个查询是否适用于所有的 DBMS?我不确定,因为我按未选择的列进行分组。如果它不起作用,还有其他选择吗?

最佳答案

当然,您可以group by 未选择的列。不过,这似乎不是您问题的要点。您想要选择一个不在 group by 中的列。那更有趣。

假设 customerID 是唯一的,您的语法是正确的 ANSI 语法。 “唯一”是对关系的更简单描述。这实际上称为功能依赖。这是一个非常简单的 blog关于这个问题。

如果我没记错的话,它已经成为 SQL 标准的一部分大约 15 年了。但是,函数依赖项的使用是可选的,并且大多数数据库不支持您的语法。

我相信唯一支持它的数据库是 Postgres、MySQL 和相关数据库。相反,您应该在 GROUP BY 中包含名称和所有未聚合的表达式。

关于sql - 您可以按未在 SQL 中选择的列分组吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49630880/

相关文章:

mysql - 如何将一些触发器合二为一?

c# - 与数据库中的两列值绑定(bind)后,如何使下拉菜单中的内容看起来整洁?

database - 可同时读写的大表

Mysql Group BY 带 if 语句

带有键列表的 Dictionary 属性中的 Linq "group by"值

python - 使用 apply、transform、agg - Python Pandas 时如何引用 groupby 索引?

sql - 表示日期/时间段

mysql - 结合 LIKE 和 EXISTS?

mysql - 从 MySQL 中选择唯一的数据集

linux - 许多 PostgreSQL 文件的 Echo 输出