使用しているRDBMSを指定していません。MySQLでは以下を使用できますGROUP_CONCAT()
:
select t1.pid,
t1.name,
group_concat(t3.address) Address
from table1 t1
left join table2 t2
on t1.pid = t2.pid
left join table3 t3
on t2.moid = t3.moid
group by t1.pid, t1.name
SQL FiddlewithDemoを参照してください
UPDATE
この結果をテーブルに表示する場合は、#1を編集すると、UPDATE
ステートメントは次のようになります。
update table1 t1
set address = (SELECT group_concat(t3.address)
FROM table2 t2
left join table3 t3
on t2.moid = t3.moid
where t1.pid = t2.pid
group by t1.pid, t1.name);
SQL FiddlewithDemoを参照してください
Oracle 11g +を使用している場合は、次のListAgg()
関数を使用できます。
select t1.pid,
t1.name,
listagg(t3.address, ', ') WITHIN GROUP (ORDER BY t1.pid) Address
from table1 t1
left join table2 t2
on t1.pid = t2.pid
left join table3 t3
on t2.moid = t3.moid
group by t1.pid, t1.name
SQL FiddlewithDemoを参照してください
SQL ServerではFOR XML PATH
、次の結果を取得するために使用できます。
select t1.pid,
t1.name,
STUFF((SELECT DISTINCT ', '+ t3.address
FROM table3 t3
LEFT JOIN table2 t2
ON t2.moid = t3.moid
WHERE t1.pid = t2.pid
FOR XML PATH('')), 1, 1, '') Address
from table1 t1
group by t1.pid, t1.name
SQL FiddlewithDemoを参照してください
これらすべてが結果を生み出します:
| PID | NAME | ADDRESS |
-------------------------------------------
| 1 | Dale | 12 South,99 North,123 Main |