Oracle 基于逗号分隔的ID获取名称
我有两张桌子,顾客和产品 产品:Oracle 基于逗号分隔的ID获取名称,oracle,plsql,Oracle,Plsql,我有两张桌子,顾客和产品 产品: productid name 1 pro1 2 pro2 3 pro3 顾客: id name productid 1 cust1 1,2 2 cust2 1,3 3 cust3 我想在select语句中得到以下结果 id name productid 1 cust1 pro1,pro2 2 cust2 pro1,pro3 3 cust
productid name
1 pro1
2 pro2
3 pro3
顾客:
id name productid
1 cust1 1,2
2 cust2 1,3
3 cust3
我想在select语句中得到以下结果
id name productid
1 cust1 pro1,pro2
2 cust2 pro1,pro3
3 cust3
我在两个表中都有300多条记录,我是后端编码的初学者,有什么帮助吗?数据库设计肯定很糟糕,但糟糕的是,你不得不接受它。下面是我使用递归查询创建的解决方案。但是我看不到
产品
表格的用途,因为您的要求与产品
表格无关
with
--Expanding each row seperated by comma
tab(col1,col2,col3) as (
Select distinct c.id,c.prdname,regexp_substr(c.productid,'[^,]',1,level)
from customers c
connect by regexp_substr(c.productid,'[^,]',1,level) is not null
order by 1),
--Appending `Pro` to each value
tab_final as ( Select col1,col2, case when col3 is not null
then 'pro'||col3
else col3
end col3
from tab )
--Displaying result as expected
SELECT
col1,
col2,
LISTAGG(col3,',') WITHIN GROUP( ORDER BY col1,col2 ) col3
FROM
tab_final
GROUP BY
col1,
col2
演示:
PS:在使用时,不要忘记像我的示例中那样放置实际的表列,它可能会有所不同。肯定是一个糟糕的数据库设计,但糟糕的是,你不得不接受它。下面是我使用递归查询创建的解决方案。但是我看不到
产品
表格的用途,因为您的要求与产品
表格无关
with
--Expanding each row seperated by comma
tab(col1,col2,col3) as (
Select distinct c.id,c.prdname,regexp_substr(c.productid,'[^,]',1,level)
from customers c
connect by regexp_substr(c.productid,'[^,]',1,level) is not null
order by 1),
--Appending `Pro` to each value
tab_final as ( Select col1,col2, case when col3 is not null
then 'pro'||col3
else col3
end col3
from tab )
--Displaying result as expected
SELECT
col1,
col2,
LISTAGG(col3,',') WITHIN GROUP( ORDER BY col1,col2 ) col3
FROM
tab_final
GROUP BY
col1,
col2
演示:
PS:在使用时,请不要忘记放置实际的表列,因为在我的示例中可能会有所不同。您的数据库设计肯定会导致很多问题。您不应该将
productid
存储为逗号分隔的值列。这将使您的查询速度变慢,因为您需要使用额外的逻辑来拆分值,然后与product
表联接。我建议您看看如何在sqlIt中创建多对多关系。它看起来像一个糟糕的数据模型。首先,你必须拆分ID,已经有几个问题和答案了。之后,您可以加入产品表并使用函数listag
进行聚合是的,我知道设计很糟糕,但我无法更改它,我必须找到解决方案,保持设计不变:(可能重复它不是重复的,这里我必须根据逗号分隔的ID获取名称,我不想将其转换为多行。您的数据库设计肯定会导致很多问题。您不应该将productid
存储为逗号分隔的值列。这会使您的查询速度变慢,因为您需要使用逗号分隔的值列。)拆分值,然后与product
表联接的附加逻辑。我建议您看看如何在sqlIt中创建多对多关系。它看起来像是一个糟糕的数据模型。首先,您必须拆分ID,已经有几个问题和答案。之后,您可以加入product表并进行聚合ActionListagg
是的,我知道设计很糟糕,但我无法改变它,我必须找到解决方案,保持设计不变:(可能的重复项不是重复项,这里我必须根据逗号分隔的id获取名称,我不想将其转换为多行。我需要与产品表连接,因为我想获取产品的名称而不是id,如果cust1 PRODUCTID为1,2,则结果应显示类似(1 cust1 pro1,pro2)的行)@学习者和您想加入这两个表的列。或者您说您想将1
与Pro1
进行比较,并将1
替换为Pro1
,这是不可能的。首先我需要拆分1,2并删除逗号,然后我需要从产品表中为这两个id获取Pro1、pro2,然后再次我想添加p带逗号的ro1、pro2和类似行的显示(1 cust1 pro1、pro2)..通过联接或子查询。@Learner您可以引用此链接。这似乎也是urs,我引用了该链接,但这有点不同,我不想转换多行记录,如果ProductID为1,2,则在同一行中,我想用相应的产品名称替换它们,即pro1,pro2。我需要使用product表进行联接因为我想获取产品的名称而不是id,若for cust1 PRODUCTID是1,2,那个么结果应该显示类似(1 cust1 pro1,pro2)的行@学习者和您想加入这两个表的列。或者您说您想将1
与Pro1
进行比较,并将1
替换为Pro1
,这是不可能的。首先我需要拆分1,2并删除逗号,然后我需要从产品表中为这两个id获取Pro1、pro2,然后再次我想添加p带逗号的ro1、pro2和类似行的显示(1 cust1 pro1、pro2)..通过联接或子查询。@Learner您可以引用此链接。这似乎也是urs,我引用了该链接,但这有点不同,我不想转换多行记录,如果productId为1,2,则在同一行中,我想用相应的产品名称替换它们,即pro1,pro2。