2017-10-11 25 views
0

例Iは、製品データを持っている:選択サブクエリ(のOracle SQL)

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

と列XIのためには、このテーブルインベントリから単一のデータ行が必要になります。

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の結果は、メインクエリjを変更せずにその値を返す方法を

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を試してみましたが、複数の列から結合する必要があるのは1つの列に対してのみ可能です。ありがとうございました。

答えて

1

SQL Fiddle

Oracleの11グラム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) 
その後 listagg()xを作る作業を行います

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です。この沿っ

何か:LISTAGGについて

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

より:http://modern-sql.com/feature/listagg

0

あなたはjoinを使用して一緒にテーブルをもたらします。

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; 
関連する問題