2017-02-06 1 views
1

테이블 A에서 데이터를 선택하고 에 동일한 인덱스이있는 모든 것을 연결하고 연결 결과를 테이블 B에 업데이트하는 방법이 필요합니다. 표 B.특정 인덱스를 사용하여 데이터를 연결하고 두 번째 테이블을 업데이트하는 방법

Table A 
+-----------+------+-------+ 
| Type  | Name | Index | 
+-----------+------+-------+ 
| Cake  | A | 1  | 
+-----------+------+-------+ 
| Cookies | B | 1  | 
+-----------+------+-------+ 
| Ice Cream | C | 1  | 
+-----------+------+-------+ 
| Patatoes | D | 1  | 
+-----------+------+-------+ 
| Cake  | E | 2  | 
+-----------+------+-------+ 
| Cookies | F | 2  | 
+-----------+------+-------+ 
| Ice Cream | G | 2  | 
+-----------+------+-------+ 
| Patatoes | H | 2  | 
+-----------+------+-------+ 

의 색인 1 행의 인덱스 1로 최종 테이블은 다음과 같아야합니다

Table B 
+-------+---------------------------------------------+ 
| Index | Line          | 
+-------+---------------------------------------------+ 
| 1  | Cake A ; Cookies B; Ice Cream C, Patatoes D | 
+-------+---------------------------------------------+ 
| 2  | Cake E ; Cookies F; Ice Cream G, Patatoes H | 
+-------+---------------------------------------------+ 

당신이 날 제발 도와 드릴까요? 덕분에 당신이 당신의 예상 출력에 세미콜론 대신 쉼표를 넣어 의미 가정

+1

어떤 버전의 Oracle입니까? 11g 이상이면 설명서의'listagg' 함수를 찾아보십시오. 이 사이트에도 많은 예제가 있습니다. 당신이 꼼짝 못하게된다면, 우리가 한 일과 그 일이 무엇이 잘못되었는지를 보여주십시오. (이전 버전을 사용 중이라면 [here] (https://oracle-base.com/articles/misc/string-aggregation-techniques) 아이디어가 있습니다. –

답변

1

, 당신은 listagg 사용할 수 있습니다

select 
    "Index", 
    listagg(Type ||' '||Name, ', ') within group (order by Name) Line 
from table_a 
group by "Index"; 

을 table_b에 대한 업데이 트를하려면, 당신은 사용할 수 있습니다 merge :

merge into table_b b 
using (
    select 
     "Index", 
     listagg(Type ||' '||Name, ', ') within group (order by Name) Line 
    from table_a 
    group by "Index" 
) a on (
    b."Index" = a."Index" 
) 
when matched then update 
set b.Line = a.Line; 
+0

select는 잘 동작합니다. 하지만 어떻게 업데이트를해야합니까? 왜냐하면이 선택은 내가 가지고있는 인덱스만큼 많은 라인을 제공하기 때문입니다. 나는주기를 만들어야합니까? – UcanDoIt

+0

@UcanDoIt - 업데이트를 참조하십시오. – GurV

+0

완벽하게 작동합니다. 너희들이 어떻게 이렇게 잘하니? 이 좋은 일을하기 위해 어디에서 연습하고 운동 할 수 있습니까? 나에게 나타낼 수 있니? – UcanDoIt

0

위의 접근 방식과의 차이점. 여기에 인덱스를 기반으로 값을 concat하려면 WM_CONCAT 함수를 사용합니다. 참고 : WM_CONCAT는 Oracle의 문서화되지 않은 함수이므로 개체가 데이터베이스에없는 경우 작동하지 않을 수 있습니다. 희망에도 도움이됩니다.

select idx, 
    wmsys.wm_concat(Typ) line -- This is Oracle undocumented function so may not work if this object not present in database 
FROM 
    (SELECT 'Cake' typ,'A' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cookies' typ,'B' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Ice Cream' typ,'C' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cake' typ,'D' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cake' typ,'E' name,2 idx FROM dual 
    UNION ALL 
    SELECT 'Cookies' typ,'F' name,2 idx FROM dual 
    UNION ALL 
    SELECT 'Ice Cream' typ,'G' name,2 idx FROM dual 
) 
GROUP BY idx; 


MERGE INTO TABLEB USING 
(SELECT idx, 
    wmsys.wm_concat(Typ) line 
FROM 
    (SELECT 'Cake' typ,'A' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cookies' typ,'B' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Ice Cream' typ,'C' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cake' typ,'D' name,1 idx FROM dual 
    UNION ALL 
    SELECT 'Cake' typ,'E' name,2 idx FROM dual 
    UNION ALL 
    SELECT 'Cookies' typ,'F' name,2 idx FROM dual 
    UNION ALL 
    SELECT 'Ice Cream' typ,'G' name,2 idx FROM dual 
) 
GROUP BY idx 
)a ON (a.idx = tableb.idx) 
WHEN matched THEN 
    UPDATE SET tableb.line = a.line; 
관련 문제