合并 SQL 中除最后一列外相同的行,压缩结果中的唯一值

问题描述 投票:0回答:2

假设我拥有一家宠物店,并且有 Customers 和 Pets 表。

如果我做了这样的查询

SELECT
CUSTOMER.ID,
CUSTOMER.NAME,
CUSTOMER.EMAIL,
PET.NAME
FROM CUSTOMERS
INNER JOIN PETS ON PET.CUSTOMER_ID = CUSTOMER.ID

我应该得到这样的结果

[1, 'John Doe', '[email protected]', 'Bailey']

但是如果我有多个宠物的客户,那意味着我会得到多行:

[1, 'John Doe', '[email protected]', 'Bailey'],
[1, 'John Doe', '[email protected]', 'Luna']

有没有办法让我以某种方式压缩这些行但保留唯一值?我怎样才能得到这样的结果

[1, 'John Doe', '[email protected]', ['Bailey', 'Luna']]

?

我尝试选择不同的客户 ID,但我认为只有当这是您选择的唯一字段时才有效?当我添加要选择的其余字段时,我仍然会得到重复的行

sql ruby-on-rails merge duplicates distinct
2个回答
1
投票

您可以使用 string_agg 函数来获得您想要的结果 -

SELECT c.ID, c.NAME, c.EMAIL,
       STRING_AGG(p.NAME, ',')
  FROM CUSTOMERS c
 INNER JOIN PETS p ON p.CUSTOMER_ID = c.ID
 GROUP BY c.ID, c.NAME, c.EMAIL;

0
投票
class Customer < ApplicationRecord
  has_many :pets
end
class Pet < ApplicationRecord
  belongs_to :customer
end
Customer.group(:id)
        .joins(:pets)
        .pluck(
          :id,
          :name,
          "JSON_ARRAYAGG(pets.name)"
        )

我还没有使用 ActiveRecord 的 Oracle 适配器,所以 YMMV。

© www.soinside.com 2019 - 2024. All rights reserved.