我有一个SQL Server问题,我希望有人能够帮助我。我有以下父子表结构。父表中的PID
值是主键(标识)。子表中的主键是 PID
和 CVal1
的组合(其中子表中的PID
是父表的外键)。如图所示,子表可以对父表中的每个PID
具有多个记录。
Parent Table
+-----+-------+-------+
| PID | Pval1 | Pval2 |
+-----+-------+-------+
| 99 | 45 | 126 |
| 100 | 45 | 155 |
| 101 | 33 | 12 |
+-----+-------+-------+
Child Table
+-----+-------+-------+-------+
| PID | CVal1 | Cval2 | Cval3 |
+-----+-------+-------+-------+
| 99 | 18 | 15 | 10 |
| 99 | 5 | 15 | 10 |
| 100 | 12 | 12 | 15 |
| 101 | 14 | 11 | 11 |
| 101 | 15 | 9 | 7 |
+-----+-------+-------+-------+
通常,针对具有特定Pval1
的一组记录更新表内容(例如,对于 Pval1
= 45;父表的前 2 条记录和子表的前 3 条记录可能会更改)。最初,我删除了两个表中的所有相关记录,然后添加了新内容;但是,现在的想法是仅删除/添加实际更改的内容。我有两个 Temp 表 #TempParent 和 #TempChild(具有相同的限制)来保存更新的内容。
我想将临时表与永久表进行比较,并在永久表中不存在的地方插入,在特定Pval1
的临时表中不存在时删除。由于 Temp 表中的PID
与永久表中不匹配,因此我将不得不在 Pval1
、Pval2
、Cval1
、Cval2
和 Cval3
上进行比较。但我不确定如何做到这一点。有没有人知道我该如何做到这一点?我真的很感激任何建议。
为什么您不将更新应用于事务中的实际表,您可以在其中回滚需要,但这是父表的脚本。如果您需要,相同的概念将适用于儿童,请告诉我。
给你:
SELECT * INTO ParentTable
FROM
(
SELECT 99 AS PID, 45 AS Pval1, 126 AS Pval2
UNION ALL
SELECT 100,45,155
UNION ALL
SELECT 101,33,12
) A;
SELECT *
FROM ParentTable;
原始父表:
PID Pval1 Pval2
----------- ----------- -----------
99 45 126
100 45 155
101 33 12
假设我的 #TempParent 是更新的数据,其中一行被删除,一行插入,一行不变:
SELECT * INTO #TempParent
FROM
(
SELECT 200 AS PID, 200 AS Pval1, 200 AS Pval2 --inserted row
UNION ALL
SELECT 101,33,12 --kept row
) A;
现在对于删除和插入语句:
DELETE
FROM ParentTable
WHERE NOT EXISTS (
SELECT Pid,Pval1,Pval2
FROM #TempParent
WHERE #TempParent.Pid = ParentTable.PID
AND #TempParent.Pval1 = ParentTable.Pval1
AND #TempParent.Pval2 = ParentTable.Pval2
);
INSERT INTO ParentTable
SELECT *
FROM #TempParent
WHERE NOT EXISTS(
SELECT Pid,Pval1,Pval2
FROM ParentTable
WHERE ParentTable.Pid = #TempParent.PID
AND ParentTable.Pval1 = #TempParent.Pval1
AND ParentTable.Pval2 = #TempParent.Pval2
);
比较您的表格(应该匹配):
SELECT *
FROM ParentTable
SELECT *
FROM #TempParent
PID Pval1 Pval2
----------- ----------- -----------
101 33 12
200 200 200
PID Pval1 Pval2
----------- ----------- -----------
101 33 12
200 200 200