Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 基于逗号分隔的ID获取名称_Oracle_Plsql - Fatal编程技术网

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表并进行聚合Action
Listagg
是的,我知道设计很糟糕,但我无法改变它,我必须找到解决方案,保持设计不变:(可能的重复项不是重复项,这里我必须根据逗号分隔的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。