Sql 将多行值更新到同一行和不同列

Sql 将多行值更新到同一行和不同列,sql,sql-server,tsql,sql-update,Sql,Sql Server,Tsql,Sql Update,我试图从另一个表更新表列 在person表中,可以有多个联系人具有相同的inst\u id 我有一个公司表,其中包含个人表中最新的两个联系人详细信息 我期待公司的表格如下: 如果只有一个联系人,请更新person1和email1。如果有2个,则同时更新这两个。如果有3个,则丢弃第3个 有人能帮我吗?这应该可以: ;with cte (rn, id, inst_id, person_name, email) as ( select row_number() over (partitio

我试图从另一个表更新表列

person
表中,可以有多个联系人具有相同的
inst\u id

我有一个
公司
表,其中包含
个人
表中最新的两个联系人详细信息

我期待
公司的
表格如下:

如果只有一个联系人,请更新
person1
email1
。如果有2个,则同时更新这两个。如果有3个,则丢弃第3个

有人能帮我吗?

这应该可以:

;with cte (rn, id, inst_id, person_name, email) as (
    select row_number() over (partition by inst_id order by id) rn, * 
    from person
    )

update f
set 
  person1 = cte1.person_name, 
  email1  = cte1.email, 
  person2 = cte2.person_name, 
  email2  = cte2.email
from firm f
left join cte cte1 on f.inst_id = cte1.inst_id and cte1.rn = 1
left join cte cte2 on f.inst_id = cte2.inst_id and cte2.rn = 2
公共表表达式(cte)用作person表中更新编号行的源,按inst_id进行分区,然后更新将cte连接两次(对于top 1和top 2)


如果您重新考虑数据库结构,我认为您不必为这次更新而烦恼。关系数据库的一个巨大优势是,您不需要在多个表中多次存储相同的数据,而只需要为一种数据创建一个表(如您案例中的person表),然后引用它(例如,通过关系或外键)

那么这对你的例子意味着什么呢?我建议,创建一个机构表,在其中插入两个属性,如contactperson1和contactperson2:但不要插入所有联系人详细信息(如电子邮件和姓名),只插入此人的主键,并将其设为外键

所以你有一张“Person”的桌子,看起来应该是这样的:

ID   INSTITUTION_ID   NAME      EMAIL
1        100          abc    abc@inst.com
2        101          efg    efg@xym.com
3        101          ijk    ijk@fg.com
4        101          rtw    rtw@rtw.com
... 
还有一张“机构”表格,如:

如果您现在想更改电子邮件地址,只需更新此人的表即可。你不需要更新公司的表格

你如何得到你想要的两个联系人的详细信息“表”?只需提出一个问题:

SELECT i.id, p1.name, p1.email, p2.name, p2.email
FROM institution i LEFT OUTER JOIN person p1 ON (i.contactperson1 = p1.id)
     LEFT OUTER JOIN person p2 ON (i.contactperson2 = p2.id)

如果您经常需要此查询并像“表”一样访问它,只需将其存储为一个视图。

您所说的:最新的2个联系人详细信息是什么意思?前2个就可以了。(ID最高)。您使用的是MySQL还是SQL Server(如tsql标记所示)?请更新您的问题,以便我们了解您需要做什么。请展示您已经尝试过的,即使是非常基本的,以及您想要实现的。我正在使用SQL Server谢谢您的建议。但是,该公司实际上是一个巨大的遗产表。我只创建了person表,我的要求是用新数据更新公司。
SELECT i.id, p1.name, p1.email, p2.name, p2.email
FROM institution i LEFT OUTER JOIN person p1 ON (i.contactperson1 = p1.id)
     LEFT OUTER JOIN person p2 ON (i.contactperson2 = p2.id)