我有一张表Stores
和一张表Schools
。这是一对多关系 - 多个学校可以由同一个商店提供服务,但反之亦然。
在开发早期,我错误地在Stores
数据库中多次重复同一个商店。我插入了如下行:
Store_ID| Store_URL
1 | http://sameurl.com
2 | http://sameurl.com
如果两个不同的学校在同一家商店,我会在一个学校行引用1
,在另一个学校行引用2
。
我可以使用GROUP BY
上的Store_URL
并使用COUNT()
来识别重复项,从而轻松识别重复项。
我面前的艰巨任务是让所有Schools
指向非重复Stores
。如果我只删除重复的Stores
,我会Schools
指向不存在的行。
如何消除重复并让共享同一商店的学校指向同一Store
行?
注意:有数千所学校和商店。手动解决方案不起作用。
答案 0 :(得分:6)
假设您的School
表格中有store_ID
来自您所说的内容。
我首先要弄清楚每个副本,你想要保留store_ID
。我还假设您希望它是最低的ID值。然后,我会将School
s'store_ID
更新为他们当前网址的MIN(store_ID)
。然后,您应该可以自由删除额外的store_ID
条记录
这就是我要进行更新的方式:
UPDATE sch
SET sch.Store_ID = matcher.store_ID
FROM Schools AS sch
INNER JOIN Stores AS st ON sch.store_ID = st.store_ID
INNER JOIN
(
SELECT MIN(st.store_id) AS store_ID, store_url
FROM Schools AS sch
INNER JOIN Stores AS st ON sch.store_ID = st.store_ID
GROUP BY Store_URL
) AS matcher ON st.Store_URL = matcher.Store_Url
AND st.Store_ID != matcher.store_ID
如果您能够删除没有关联学校的商店,以下查询将删除额外的行:
DELETE FROM st
FROM Stores AS st
LEFT JOIN Schools AS sch ON st.Store_ID = sch.Store_Id
WHERE sch.Store_id IS NULL
如果您只想删除商店的重复记录,我会查看此查询而不是上述内容:
DELETE FROM st
FROM Stores AS st
INNER JOIN
(
SELECT MIN(st.store_ID) store_Id, st.Store_Url
FROM Stores AS st
GROUP BY st.Store_URL
) AS useful ON st.Store_Url = useful.Store_URL
WHERE st.Store_ID != useful.store_Id
答案 1 :(得分:0)
以下更新语句将更改一所学校数据库中的值:
UPDATE Schools SET store_id = 1 WHERE store_id = 2;
DELETE FROM Stores WHERE Store_ID = 2;