我試圖從另一個表中更新表列。將多個行值更新到同一行和不同列
在person
表,可以存在多個聯繫人具有相同inst_id
。
我有一個firm
表,它將從person
表中獲得最新的2個聯繫方式。
我期待的firm
表如下:
如果只有一個聯繫人,更新person1
和email1
。如果有2個,則同時更新。如果有3個,則丟棄第3個。
有人可以幫助我嗎?
我試圖從另一個表中更新表列。將多個行值更新到同一行和不同列
在person
表,可以存在多個聯繫人具有相同inst_id
。
我有一個firm
表,它將從person
表中獲得最新的2個聯繫方式。
我期待的firm
表如下:
如果只有一個聯繫人,更新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
用作在人表更新數的行的源極,通過INST_ID劃分的公用表表達式(CTE),然後將更新加入CTE兩次(對於頂部1和頂部2)。
謝謝,這工作。 – Sarin 2014-11-24 10:49:43
我覺得你不必費心自己與此更新,如果你重新考慮你的數據庫結構。關係數據庫的一個重要優點是,你不需要在多個表中存儲多次相同的數據,但是對於一種數據有一個單獨的表(比如你的案例中的人的表),然後引用它(通過例如關係或外鍵)。
那麼這對你的例子意味着什麼?我建議,創建一個機構的表格,在其中插入contactperson1和contactperson2兩個屬性:但不要插入所有聯繫人詳細信息(如電子郵件和姓名),只是人的主鍵並將其設置爲外鍵。
所以,你有一個表「人」,這應該是這個樣子:
ID INSTITUTION_ID NAME EMAIL
1 100 abc [email protected]
2 101 efg [email protected]
3 101 ijk [email protected]
4 101 rtw [email protected]
...
和一張桌子「機構」,如:
ID CONTACTPERSON1 CONTACTPERSON2
100 1 NULL
101 2 3
...
如果你現在要更改電子郵件地址,只需更新人員的表格。你不需要更新公司的表格。
你如何得到你想要的兩個聯繫人的細節「表」?只需查詢:
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)
如果您經常需要此查詢並像訪問「表」一樣將其存儲爲視圖。
感謝您的建議。但是,該公司實際上是一個巨大的遺留表格。 我只創建了人員表格,我的要求是用新數據更新公司。 – Sarin 2014-11-24 11:54:21
你是什麼意思:*最新的2聯繫人詳細信息*? – 2014-11-24 10:03:13
頂2將罰款。 (具有最高的ID)。 – Sarin 2014-11-24 10:05:16
你使用MySQL或SQL Server(如tsql標籤所示)? – jpw 2014-11-24 10:20:20