作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下查询:
SELECT array_agg(DISTINCT p.id) AS price_ids,
array_agg(p.name) AS price_names
FROM items
LEFT JOIN prices p on p.item_id = id
LEFT JOIN third_table t3 on third_table.item_id = id
WHERE id = 1;
当我LEFT JOIN
third_table
时,我所有的价格都被复制了。
我在 ARRAY_AGG()
中使用 DISTINCT
来获取没有重复的 ID,但我也想要没有重复的名称。
如果我使用 array_agg(DISTINCT p.name) AS price_names
,它将根据名称而不是 ID 返回不同的值。
我想做类似于 array_agg(DISTINCT ON (p.id) p.name) AS price_names
的操作,但它是无效的。
如何在 ARRAY_AGG()
中使用 DISTINCT ON
?
最佳答案
先聚合,后加入:
SELECT p.price_ids,
p.price_names,
t3.*
FROM items
LEFT JOIN (
SELECT pr.item_id,
array_agg(pr.id) AS price_ids,
array_agg(pr.name) AS price_names
FROM prices pr
GROUP BY pr.item_id
) p on p.item_id = items.id
LEFT JOIN third_table t3 on third_table.item_id = id
WHERE items.id = 1;
如果您只选择一个项目,使用横向连接可能会更快:
SELECT p.price_ids,
p.price_names,
t3.*
FROM items
LEFT JOIN LATERAL (
SELECT array_agg(pr.id) AS price_ids,
array_agg(pr.name) AS price_names
FROM prices pr
WHERE pr.item_id = items.id
) p on true
LEFT JOIN third_table t3 on third_table.item_id = id
WHERE items.id = 1;
关于postgresql - 如何在 ARRAY_AGG() 中使用 DISTINCT ON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60312054/
我是一名优秀的程序员,十分优秀!