2014-04-07 63 views
0

我在表格中的重複的條目,如:使用另一個表更新表中的外鍵?

id | name 
========= 
1 blue 
2 red 
3 blue 
4 blue 
5 red 

表B,從表A中的ID是一個外鍵,我想更新從表A中的最小內徑爲外鍵,然後刪除從表一式兩份,所以B表目前看起來像這樣

id | tableAId 
============= 
1  1 
2  2 
3  3 
4  4 
5  5 

表B中應該結束了看起來像

id | tableAId 
============= 
1  1 
2  2 
3  1 
4  1 
5  2 

表A中應該結束了尋找升邁克:

id | name 
========= 
1 blue 
2 red 

UPDATE tableB 
SET Id = (
SELECT MIN(Id) FROM tableB b 
INNER JOIN tableA a on a.Id = b.Id 
GROUP BY a.Name) 
+0

我曾嘗試基於tableB的更新在分組的名稱和帶回min(id),但這會拋出一個錯誤,因爲我試圖將一個字段設置爲多個值 – xaisoft

+0

向我們展示您嘗試的內容,以便我們可以從中取出它。 – Crono

+0

@Crono - 更新後,但不起作用。我基本上想在實際刪除表A中的行之前用min(id)更新已刪除的id。 – xaisoft

回答

0

查找最小值的CTE,並用它來更新表B:

with cte as 
( 
    select min(id) as id, name 
    from tablea 
    group by name 
) 
update b 
    set tableaid = c.id 
from tableb b 
    inner join tablea a on a.id = b.tableaid 
    inner join cte c on c.name = a.name 

然後刪除TableA的未使用的記錄:

delete a 
    from tablea a 
where not exists 
(
    select * from tableb b 
    where b.tableaid = a.id 
) 
相關問題