Saya memiliki tabel Parent-Child berikut:

TABEL ORANG TUA

PARENT_ID | COL_A 

1         |  "DOG"
2         |  "CAT"
3         |  "FROG"

MEJA ANAK

CHILD_ID  | PARENT_ID | COL_B   | COL_C
 
1         |  1        | "JOE"   | "DOE"
2         |  2        | "BOB"   | "BOBSON"
3         |  2        | "MARY"  | "DOETTE"
4         |  3        | "KEVIN" | "KEVINSON"
5         |  3        | "TOM"   | "TOMSON"
6         |  3        | "VIC"   | "VICSON"

Sekarang saya ingin menggabungkan semua baris anak menjadi satu baris dengan menggabungkan kolom dengan cara khusus sehingga akan menghasilkan html yang bagus.

Output yang diinginkan adalah seperti ini:

PARENT_ID | COL_A    | CUSTOM_COL

1         |  "DOG"   | <H1>JOE DOE</H1>
2         |  "CAT"   | <H1>BOB BOBSON, MARY DOETTE</H1>
3         |  "FROG"  | <H1>KEVIN KEVINSON, TOM TOMSON, VIC VICSON</H1>

Pada dasarnya apa yang saya coba lakukan adalah menggabungkan semua kolom baris anak dengan cara di mana saya dapat menyesuaikan hasilnya. Dalam hal ini, saya membutuhkan kolom untuk menjadi string html.

Saya dapat bergabung dengan tabel seperti

SELECT 
p.*,c.*
FROM
PARENT_TABLE p
LEFT JOIN
CHILD_TABLE c
ON p.PARENT_ID = c.PARENT_ID

Tetapi ini menghasilkan baris yang tidak digabungkan. Bagaimana saya bisa menggabungkan semua baris anak menjadi satu?

0
user2924127 12 Mei 2021, 03:24

3 jawaban

Jawaban Terbaik

Sepertinya Anda ingin menggunakan listagg

SELECT p.parent_id,
       p.col_a,
       '<h1>' ||
         listagg(c.col_b || ' ' || c.col_c) 
           within group( order by c.child_id ) ||
         '</h1>' agg_column
  FROM PARENT_TABLE p
       LEFT JOIN CHILD_TABLE c
         ON p.PARENT_ID = c.PARENT_ID
 GROUP BY p.parent_id,
          p.col_a
2
Justin Cave 12 Mei 2021, 00:29

Jika Anda membuat elemen xml, Anda harus menggunakan fungsi xml. Dalam kueri di bawah ini saya menggunakan xmlserialize untuk menghasilkan string persis seperti yang Anda tunjukkan, tetapi dalam aplikasi kehidupan nyata Anda, Anda mungkin hanya perlu membuat xmlelements (tanpa memanggil xmlserialize pada hasil).

Dengan asumsi tabel disebut parent dan child, dengan kolom yang Anda tunjukkan, kueri dan output terlihat seperti ini:

select parent_id, col_a,
       xmlserialize(document xmlelement("HI", hi_list)) as custom_col
from   (
         select parent_id, 
                listagg(col_b || ' ' || col_c, ', ') 
                        within group (order by child_id) as hi_list
         from   child
         group  by parent_id
       )
       full outer join parent using (parent_id)
;

PARENT_ID COL_A CUSTOM_COL
--------- ----- -----------------------------------------------
        1 DOG   <HI>JOE DOE</HI>                
        2 CAT   <HI>BOB BOBSON, MARY DOETTE</HI>
        3 FROG  <HI>KEVIN KEVINSON, TOM TOMSON, VIC VICSON</HI>

Saya menggunakan gabungan luar penuh, untuk berjaga-jaga jika ada id yang tidak cocok di kedua tabel. Anda dapat mengubah ke gabungan luar kiri Anda (itu akan menjadi gabungan luar kanan dalam permintaan saya).

0
mathguy 12 Mei 2021, 02:18

Bergabunglah dengan listagg; contoh data sampai baris #10; kueri dimulai pada baris #11.

SQL> with
  2  parent (parent_id, col_a) as
  3    (select 1, 'Dog' from dual union all
  4     select 2, 'Cat' from dual
  5    ),
  6  child (child_id, parent_Id, col_b, col_c) as
  7    (select 1, 1, 'Joe', 'Doe'     from dual union all
  8     select 2, 2, 'Bob', 'Bobson'  from dual union all
  9     select 3, 2, 'Mary', 'Doette' from dual
 10    )
 11  select p.parent_id, p.col_a,
 12    '<H1>' ||
 13    listagg(c.col_b ||' '|| c.col_c, ', ') within group (order by null)  ||
 14    '</H1>' custom_col
 15  from parent p join child c on c.parent_id = p.parent_id
 16  group by p.parent_Id, p.col_a;

 PARENT_ID COL CUSTOM_COL
---------- --- ----------------------------------------
         1 Dog <H1>Joe Doe</H1>
         2 Cat <H1>Bob Bobson, Mary Doette</H1>

SQL>
1
Littlefoot 12 Mei 2021, 00:28