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)