sql - 请勿在分组依据中包含选择列

标签 sql postgresql group-by subquery

这是我的表格(仅包括相关列)

Table: carts
address_id - integer

Table: addresses
name - varchar
phone - varchar

Table: orders
order_number - integer (this is the foreign key for cart table)

我想获取只订购过一次的客户的电话号码,因此我构造了以下查询

select addresses.phone 
from orders 
   inner join carts on orders.order_number = carts.id 
   inner join address on carts.address_id = addresses.id 
group by addresses.phone 
having count(orders.*) = 1;

这很好用!但我确实还需要选择客户名称和订单号,我将选择语句更新为

select addresses.phone, addresses.name, orders.order_number ...

现在,postgres 敦促我将这些列包含在 GROUP BY 子句中,但这不会返回我想要的结果。

我尝试使用如下子查询,这似乎得到了我想要的结果

select addresses.phone, (select ad.name from addresses ad where ad.phone = addresses.phone) ...

但是使用子查询是解决这个问题的唯一方法吗?或者有没有更简单/最佳的方法?

最佳答案

您可以通过 window function 来实现此目的这不需要将所有内容分组:

select *
from (
  select addresses.phone, addresses.name, orders.order_number, 
         count(orders.order_number) over (partition by addresses.phone) as cnt
  from orders 
     inner join carts on orders.order_number = carts.id 
     inner join address on carts.address_id = addresses.id 
) t 
where cnt = 1;

关于sql - 请勿在分组依据中包含选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932989/

相关文章:

sql - 如何在 SQL Server 中创建和查询链接数据库服务器?

php - Yii Framework 2.0 主键的重复键值

c# - LINQ GROUP BY 和 MAX()

MySQL 组结果

mysql - 分组依据 - 需要单行显示

SQL 语句

SQL ORDER BY 带 CASE 带 UNION ALL

php - 尝试显示 2 个表数据

mysql - 如何获取与另一个表中的多行相关的行?

ruby-on-rails - Rails 4 - 按属性的存在排序