2017-10-11 110 views
0

比如我有產品數據:選擇子查詢表返回多行的字符串(一列)(甲骨文SQL)

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

而對於列第十一需要一個數據行從表中盤點:

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 

如何返回值,而不改變主查詢Ĵ oin和from,我需要子查詢來返回該值。我嘗試list_aggregate,但它是唯一可能的一列,我需要從多個列組合。謝謝。

回答

1

SQL Fiddle

的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) 

Results

| 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 | 
+0

謝謝,這個解決我的問題 –

1

LISTAGG是給你的。

東西沿着這條:

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

更多LISTAGGhttp://modern-sql.com/feature/listagg

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;