假设我拥有一家宠物店,并且有 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,但我认为只有当这是您选择的唯一字段时才有效?当我添加要选择的其余字段时,我仍然会得到重复的行
您可以使用 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;
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。