2014-11-24 158 views
2

我試圖從另一個表中更新表列。將多個行值更新到同一行和不同列

Person Table

person表,可以存在多個聯繫人具有相同inst_id

我有一個firm表,它將從person表中獲得最新的2個聯繫方式。

我期待的firm表如下:

Firm Table

如果只有一個聯繫人,更新person1email1。如果有2個,則同時更新。如果有3個,則丟棄第3個。

有人可以幫助我嗎?

+0

你是什麼意思:*最新的2聯繫人詳細信息*? – 2014-11-24 10:03:13

+0

頂2將罰款。 (具有最高的ID)。 – Sarin 2014-11-24 10:05:16

+0

你使用MySQL或SQL Server(如tsql標籤所示)? – jpw 2014-11-24 10:20:20

回答

2

這應該工作:

;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)。

Sample SQL Fiddle

+0

謝謝,這工作。 – Sarin 2014-11-24 10:49:43

0

我覺得你不必費心自己與此更新,如果你重新考慮你的數據庫結構。關係數據庫的一個重要優點是,你不需要在多個表中存儲多次相同的數據,但是對於一種數據有一個單獨的表(比如你的案例中的人的表),然後引用它(通過例如關係或外鍵)。

那麼這對你的例子意味着什麼?我建議,創建一個機構的表格,在其中插入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) 

如果您經常需要此查詢並像訪問「表」一樣將其存儲爲視圖。

+0

感謝您的建議。但是,該公司實際上是一個巨大的遺留表格。 我只創建了人員表格,我的要求是用新數據更新公司。 – Sarin 2014-11-24 11:54:21

相關問題