回答

收藏

T-SQL``合并''两行或``凌驾''所有FK关系

技术问答 技术问答 107 人阅读 | 0 人回复 | 2023-09-12

我有一个生产数据库,有时需要合并单个表中的多余行。
; S5 ~# ~2 {! q, V% E1 W假设表中的两行都有相同的值,但它们是ID除外。8 v% l5 b9 r; P7 E/ b: j
Table &quotrimaryStuff"ID | SomeValue1  | "I have value"2  | "I have value"3  | "I am different"我们还假设有很多相关的表。因为重复项是! |6 F, q6 P6 g( C' w+ {! L0 c) a
PrimaryStuff表中创建,所以经常在这些子表中创建行,这些行应该与之相匹配PrimaryStuff表单个记录相关。6 S- W& F% M1 m, w& V
这些表的数量和名称不受我控制,运行时应动态考虑。    IE:我不知道相关记录的名称甚至数量,因为其他人可能会编辑我不知道的数据库。
/ W8 C4 t& ~" e0 `1 kTable "ForeignStuff"ID | PrimaryStuffId | LocalValue1| 1| "I have the correct FK"2| 1| "I have the correct FK"3| 2| "I should get pointed to an FK of 1"为了解决PrimaryStuff我希望所有相关表格都能重复第一行和第二行的重复问题FK更改为1,然后删除PrimaryStuff第二行。这个 应该8 B" k: \4 E" n5 o
微不足道,好像PrimaryStuff第一行不存在。我可以在第二行到第一行的主键上更新,所做的更改将被分级。我不能这样做,因为那将是PrimaryStuff索引中唯一的重复键。
% I' a3 N0 d% y( }/ N+ z' l) g随时提问,我会尽量清除所有令人困惑的内容。& |$ [2 i3 b6 K5 Z8 l1 v
                                                                5 g1 M1 S7 k  v+ N8 f
    解决方案:                                                                # B. {" h, v# o# g2 R& U. p8 t
                                                                首先,让我们得到需要更新的行列表(据我所知,你想要最低的ID所有较高的替换ID)9 n7 {. `: M1 H0 X( v- J4 d0 y5 n
    SELECT MIN(ID) OVER (PARTITION BY SomeValue ORDER BY SomeValue,ID ASC) AS FirstID,       ID,       SOMEVALUE FROM PrimaryStuff我们可以删除它FirstID和ID匹配的内容,这些都无所谓; P5 T# l) u6 Y5 i8 t
SELECT FirstID,ID FROM( SELECT MIN(ID) OVER (PARTITION BY SomeValue ORDER BY SomeValue,ID ASC) AS FirstID,       ID,       SOMEVALUE FROM PrimaryStuff) TWHERE FirstID != ID现在,我们有一个更改列表。我们可以在更新句子中使用它,并将其放置在临时表(或CTE,如下所示):# w# X! A4 n) J. Q
WITH ChangeList AS(  SELECT FirstID,ID FROM  (  SELECT MIN(ID) OVER (PARTITION BY SomeValue ORDER BY SomeValue,ID ASC) AS FirstID,       ID   FROM PrimaryStuff  ) T  WHERE FirstID != ID)UPDATE ForeignStuffSET PrimaryStuffId = ChangeList.FirstIDFROM ForeignStuffJOIN ChangeList ON ForeignStuff.ID = ChangeList.ID注:代码未经测试,可能有错别字。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则