选择在表中将多行作为字符串(一列)返回的子查询(Oracle SQL)

时间:2017-10-11 10:43:13

标签: sql oracle oracle11g

示例I有产品数据:

Product_No  Column1 Column2 ... ColumnX
1           A       10          
2           B       11
3           C       12

对于第X列,我需要此表库存中的单个数据行:

Product_No Inventory_No ColumnA ColumnB ColumnC
1           1           ABC     20      30
1           2           DDD     30      50
2           1           EFG     60      70
2           2           CDE     99      100
3           3           EFF     120     30

列x的结果应为

Product_No  Column1 Column2 ... ColumnX
1           A       10          ABC-20-30,DDD-30-50
2           B       11          EFG-60-70,CDE-99-100
3           C       12          EFF-120-30

如何在不改变主查询连接的情况下返回该值,我需要子查询来返回该值。我已经尝试了list_aggregate,但它只能用于我需要从多列组合的一列。谢谢。

3 个答案:

答案 0 :(得分:1)

LISTAGG适合你。

有关此事:

 SELECT Product_No, LISTAGG(ColumnA || '-' || ColumnB || '-' || ColumnC, ',')
   FROM tbl
  GROUP BY Product_No;

有关LISTAGG的更多信息:http://modern-sql.com/feature/listagg

答案 1 :(得分:1)

What’s the best way to reload / refresh an iframe?

Oracle 11g R2架构设置

CREATE TABLE Product ( Product_No, Column1, Column2 ) AS
SELECT 1, 'A', 10 FROM DUAL UNION ALL
SELECT 2, 'B', 11 FROM DUAL UNION ALL
SELECT 3, 'C', 12 FROM DUAL
/
CREATE TABLE Inventory ( Product_No, Inventory_No, ColumnA, ColumnB, ColumnC ) AS
SELECT 1, 1, 'ABC',  20,  30 FROM DUAL UNION ALL
SELECT 1, 2, 'DDD',  30,  50 FROM DUAL UNION ALL
SELECT 2, 1, 'EFG',  60,  70 FROM DUAL UNION ALL
SELECT 2, 2, 'CDE',  99, 100 FROM DUAL UNION ALL
SELECT 3, 3, 'EFF', 120,  30 FROM DUAL
/

查询1

SELECT p.*, i.ColumnX
FROM   Product p
       LEFT OUTER JOIN
       ( SELECT Product_no,
                LISTAGG(
                  ColumnA || '-' || ColumnB || '-' || ColumnC,
                  ','
                ) WITHIN GROUP ( ORDER BY Inventory_no )
                AS ColumnX
         FROM   Inventory
         GROUP BY Product_No
       ) i
       ON ( p.product_no = i.product_no )

<强> SQL Fiddle

| PRODUCT_NO | COLUMN1 | COLUMN2 |              COLUMNX |
|------------|---------|---------|----------------------|
|          1 |       A |      10 |  ABC-20-30,DDD-30-50 |
|          2 |       B |      11 | EFG-60-70,CDE-99-100 |
|          3 |       C |      12 |           EFF-120-30 |

答案 2 :(得分:0)

您使用join将表格放在一起。然后listagg()完成了制作专栏x

的工作
select p.Product_No, p.Column1, p.Column2,
       listagg(i.ColumnA || '-' || i.ColumnB || '-' || i.ColumnC, ',') within group (order by inventory_no) as x
from product p left join
     inventory i
     on p.product_no = i.product_no
group by p.Product_No, p.Column1, p.Column2;