Sql 根据第三个表中的字段,将一个表中的多条记录合并到另一个表中的一个字段中

Sql 根据第三个表中的字段,将一个表中的多条记录合并到另一个表中的一个字段中,sql,Sql,我有三张桌子: 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

我有三张桌子:

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中的信息链接起来?

您可以通过连接来实现这一点:

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\u concat
。其他字符串聚合函数有
listag
ws_concat
。希望您没有使用SQL Server,因为这里的字符串连接比较困难。

您没有指定要使用的RDBMS。在MySQL中,您可以使用:

编辑#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);

如果您使用的是Oracle 11g+,则可以使用以下功能:

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 Server中,可以使用以下命令获得结果:

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
| PID | NAME |                    ADDRESS |
-------------------------------------------
|   1 | Dale | 12 South,99 North,123 Main |

所有这些都会产生以下结果:

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
| PID | NAME |                    ADDRESS |
-------------------------------------------
|   1 | Dale | 12 South,99 North,123 Main |

你使用的是什么样的RDBMS?看起来你应该考虑使用一个数据透视表——这取决于你的RDBMS。如果不受支持,也许函数可以提供类似的功能。@DavidBurke请接受我使用mySQL的最佳答案。很抱歉没提那件事。在我最初的问题中:“如何将表3中的多个地址合并到表1中的一个地址字段中,并将两个表与表2中的信息链接起来?”我想合并表3中的多个地址,并将结果放入表1中的地址字段中。你给我的很好,但它是一个Select语句,而不是Update语句。我真讨厌mySQL。有人可以将上面的mySQL语句转换为UPDATE语句,将该语句的结果插入表1的地址字段中吗。thx@DavidBurke请参见我的编辑,我已更新了语法以包含
UPDATE
语句。