Pertanyaan aslinya adalah spesifik basis data, tetapi mungkin ini adalah tempat yang baik untuk memasukkan jawaban yang lebih umum. Ini adalah pertanyaan umum. Konsep yang Anda gambarkan sering disebut sebagai 'Penggabungan Grup'. Tidak ada solusi standar dalam SQL-92 atau SQL-99. Jadi, Anda memerlukan solusi khusus vendor.
- MySQL - Gunakan fungsi GROUP_CONCAT bawaan. Dalam contoh Anda, Anda akan menginginkan sesuatu seperti ini:
select o.ID, o.Address, o.OtherDetails, GROUP_CONCAT( concat(e.firstname, ' ', e.lastname) ) as Employees from employees e inner join organization o on o.org_id=e.org_id group by o.org_id
- PostgreSQL - PostgreSQL 9.0 sama sederhananya sekarang karena string_agg(expression, delimiter) sudah ada di dalamnya. Ini dia dengan 'ruang koma' di antara elemen:
select o.ID, o.Address, o.OtherDetails, STRING_AGG( (e.firstname || ' ' || e.lastname), ', ' ) as Employees from employees e inner join organization o on o.org_id=e.org_id group by o.org_id
PostgreSQL sebelum 9.0 memungkinkan Anda untuk mendefinisikan fungsi agregat Anda sendiri dengan CREATE AGGREGATE. Sedikit lebih banyak bekerja daripada MySQL, tetapi jauh lebih fleksibel. Lihat postingan lain untuk lebih jelasnya. (Tentu saja PostgreSQL 9.0 dan yang lebih baru memiliki opsi ini juga.)
-
Oracle - ide yang sama menggunakan LISTAGG .
-
MS SQL Server - ide yang sama menggunakan STRING_AGG
-
Solusi penggantian - dalam teknologi basis data lain atau dalam versi yang sangat lama dari teknologi yang tercantum di atas, Anda tidak memiliki fungsi penggabungan grup ini. Dalam hal ini, buat prosedur tersimpan yang menggunakan org_id sebagai inputnya dan mengeluarkan nama karyawan yang digabungkan. Kemudian gunakan prosedur tersimpan ini dalam kueri Anda. Beberapa tanggapan lain di sini mencakup beberapa detail tentang cara menulis prosedur tersimpan seperti ini.
select o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees from organization o