2013-01-12 76 views
-1

另一個表我有三個表:在表中合併多個記錄到一個領域中基於領域的第三個表

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中的一個地址字段,將兩個表與表2中的信息鏈接起來?

+0

你使用的是什麼rdbms? – Taryn

+0

看起來你應該考慮使用一個PIVOT表 - 這取決於你的RDBMS。如果不支持,也許一個函數可以提供類似的功能。 – sgeddes

+0

@DavidBurke請接受最好的答案 – veritas

回答

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 Fiddle with Demo

編輯#1,如果你想UPDATE表這個結果,那麼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 Fiddle with Demo

如果喲u的使用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 Fiddle with Demo

在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 Fiddle with Demo

所有這些產生的結果:

| PID | NAME |     ADDRESS | 
------------------------------------------- 
| 1 | Dale | 12 South,99 North,123 Main | 
+0

我正在使用mySQL。對不起,沒有提到。在我原來的問題中:「我如何將表3中的多個地址合併到表1中的一個地址字段中,將兩個表與表2中的信息鏈接起來?」我想將表3中的多個地址組合起來,並將結果放入地址字段的表1中。你給我的東西很棒,但它是一個Select語句而不是Update語句。我真的很討厭mySQL。有人可以請將上面的mySQL語句轉換爲UPDATE語句,以將此語句的結果插入到表1的地址字段中。thx –

+0

@DavidBurke請參閱我的編輯,我已更新語法以包含「UPDATE」語句。 – Taryn

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不存在於所有數據庫。 。 。其他字符串聚合功能是listaggws_concat。希望你沒有使用SQL Server,因爲字符串串聯更難。