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

时间:2015-03-10 16:54:17

标签: sql-server

我有一个SQL Server问题,我希望有人可以帮助我。我有以下父子表结构。 Parent表中的PID值是主键(标识)。子表中的主键是组合PIDCVal1(其中,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不会与永久表匹配,因此我必须在Pval1Pval2,{{1}进行比较},Cval1Cval2。但我不知道如何做到这一点。有没有人知道我怎么能这样做?我真的很感激任何建议。

1 个答案:

答案 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