使用表比较更新 SQL 父/子表记录 #Temp



我有一个SQL Server问题,我希望有人能够帮助我。我有以下父子表结构。父表中的PID值是主键(标识)。子表中的主键是 PIDCVal1 的组合(其中子表中的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与永久表中不匹配,因此我将不得不在 Pval1Pval2Cval1Cval2Cval3 上进行比较。但我不确定如何做到这一点。有没有人知道我该如何做到这一点?我真的很感激任何建议。

我不知道

为什么您不将更新应用于事务中的实际表,您可以在其中回滚需要,但这是父表的脚本。如果您需要,相同的概念将适用于儿童,请告诉我。

给你:

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

最新更新