gpt4 book ai didi

sql - 使用连接和解码在子选择中排序

转载 作者:行者123 更新时间:2023-12-04 13:40:11 25 4
gpt4 key购买 nike

假设我有两个表:

产品

product_id  (other fields are of no concern)

product_id  sku_id   color_id   color_name  (other fields such as size but unimportant)
001 11 5 green
001 12 1 black
001 13 3 red
002 21 1 black
002 22 2 yellow
002 23 8 magenta
002 24 9 turquoise

我需要重写一个查询,以获取产品 ID 列表,其中包含与该产品关联的所有颜色/颜色 ID 的逗号分隔列表。颜色 ID/名称在两个列表中的顺序必须相同。

期望的输出:

product_id  colorIds  colorNames
001 1,3,5 black,red,green
002 1,2,8,9 black,yellow,magenta,turquoise

请注意,颜色 ID 顺序的连接列表映射到颜色名称顺序。

当前输出:

product_id  colorIds  colorNames
001 1,3,5 green,black,red -- out of order sometimes
002 1,2,8,9 black,yellow,magenta,turquoise

当前使用的查询:

select distinct(p.product_id) as product_id, 
(select decode(dbms_lob.SubStr(wm_concat(DISTINCT color_name)),'NO COLOR','','No Color','','no color','',null,'',dbms_lob.SubStr(wm_concat(DISTINCT color_name))) as color_name from sku where product_id = p.product_id) as colorName,
(select decode(dbms_lob.SubStr(wm_concat(DISTINCT color_code)),'000','',dbms_lob.SubStr(wm_concat(DISTINCT color_code))) from sku where product_id = p.product_id) as colorCode

from product p;

我正在考虑在这些子选择中添加 order by 子句,但查询出错,说缺少右括号 - 奇怪的是似乎没有不匹配的括号。欢迎提出任何建议。

编辑 *上面的查询被高度简化了。实际上,它与十几个其他表连接以获得与产品相关的其他数据列,其中大部分是非聚合数据。该解决方案不应在主查询中使用 group by 子句,或者建议一种合理的方式来满足此要求。

最佳答案

这可能对你有用:

SELECT p.product_id
, LISTAGG(s.color_id, ',') WITHIN GROUP ( ORDER BY s.color_id ) AS colorIds
, LISTAGG(s.color_name, ',') WITHIN GROUP ( ORDER BY s.color_id ) AS colorNames
FROM product p LEFT JOIN ( SELECT DISTINCT product_id, color_id, color_name FROM sku ) s
ON p.product_id = s.product_id
GROUP BY p.product_id
ORDER BY product_id

LISTAGG() 可以排序,而 WM_CONCAT() 不能(而且它没有记录,等等)。

根据 OP 关于非聚合数据的评论进行更新:

WITH product_colors AS (
SELECT p.product_id
, LISTAGG(s.color_id, ',') WITHIN GROUP ( ORDER BY s.color_id ) AS colorIds
, LISTAGG(s.color_name, ',') WITHIN GROUP ( ORDER BY s.color_id ) AS colorNames
FROM product p LEFT JOIN ( SELECT DISTINCT product_id, color_id, color_name FROM sku ) s
ON p.product_id = s.product_id
GROUP BY p.product_id
)
SELECT t1.other_column, t2.other_column, etc.
FROM table1 t1 JOIN table2 t2 ON ...
JOIN product_colors pc ON ...

关于sql - 使用连接和解码在子选择中排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28029361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com