我有一个SQL Server问题,我希望有人可以帮助我。我有以下父子表结构。 Parent表中的PID
值是主键(标识)。子表中的主键是组合PID
和CVal1
(其中,Child表中的PID
是Parent表的外键)。如图所示,子表可以为父表中的每个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条记录表可能会改变)。最初,我删除了两个表中的所有相关记录,然后添加了新内容;但是,现在的想法是只删除/添加实际更改的内容。我有两个临时表#TempParent和#TempChild(具有相同的限制),用于保存更新的内容。
我想将临时表与永久表中的INSERT和永久表中不存在的INSERT以及特定Pval1
的临时表中不存在的DELETE进行比较。由于Temp表中的PID
不会与永久表匹配,因此我必须在Pval1
,Pval2
,{{1}进行比较},Cval1
和Cval2
。但我不知道如何做到这一点。有没有人知道我怎么能这样做?我真的很感激任何建议。
答案 0 :(得分:1)
我不知道你为什么不将更新应用到需要回滚的事务中的实际表中,但这里是ParentTable的脚本。如果您需要,同样的概念适用于Child,请告诉我。
你走了:
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;
原始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