-1

私は3つのテーブルを持っています:

Table 1: 
pid, name, address  
1    Dale  BLANK

Table 2: 
pid, moid  
1    12

Table 3: 
moid, address  
12    123 Main   
12    12 South   
12    99 North   

出力には次のものが必要です。

Table 1: 
pid, name, address   
1    Dawn  123 Mian,12 South,99 North

表3の複数のアドレスを表1の1つのアドレスフィールドに結合して、2つのテーブルを表2の情報にリンクするにはどうすればよいですか。

4

2 に答える 2

1

これは結合で行います。

select table1.pid, table1.name,
       group_concat(table3.address, ', ')
from table2 join
     table1
     on table2.pid = table1.pid join
     table3
     on table2.moid = table3.moid
gorup by table1.pid

この関数group_concatは、すべてのデータベースに存在するわけではありません。。。他の文字列集計関数はとlistaggですws_concat。SQL Serverでは文字列の連結が難しいため、SQLServerを使用していないことを願っています。

于 2013-01-12T02:57:53.917 に答える
1

使用している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 |
于 2013-01-12T02:59:56.847 に答える