2017-10-11 3 views
0

예 나는 제품 데이터가 있습니다선택 하위 쿼리 (오라클 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 

oin 및 from, 그 값을 반환하려면 하위 쿼리가 필요합니다. 나는 list_aggregate 해봤지만 하나의 열에 대해서만 가능하다. 여러 개의 열을 결합해야한다. 고맙습니다.

답변

1

SQL Fiddle

오라클 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) 
012,351을 6,

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; 

LISTAGG에 대한 : http://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;