将数据从SQL Server表复制到同一个表

时间:2016-08-21 19:56:39

标签: sql sql-server database

我有一个名为Customer的数据库,其中有一个名为CustDetails的表。表中的数据类似于下面(为简洁起见,我删除了一些数据)。 ID是PK。

CustDetails

ID  CustNo  Year  StatusId
--------------------------
1   1231    2015    1
2   1232    2015    2
3   1233    2015    2
4   1234    2014    1
5   1235    2014    2

我在同一台服务器上有另一个名为Claim的数据库,它有一个名为ClaimDetails的表(不要问我为什么这些表不在同一个数据库中但是设计决定是在我加入之前做出的,并不是我可以改变的事情。)

数据类似于下面的内容(为了简洁起见,还删除了一些数据)

ClaimDetails

ID  ClaimNumber CustNo
----------------------
1   1           1231
2   2           1232
3   3           1236
4   4           1237

我有几件事要做:

  1. 从年份为2015年的CustDetails复制所有行,并将年份更改为2016
  2. 如果第1部分的结果中的状态为2,则将其设置为2016年的1
  3. 创建一个否定列表,以查找CustNo表中但不在ClaimDetails表中的CustDetails - 因为这些会在CustDetails表中创建一个新行 ID CustNo Year StatusId -------------------------- 1 1231 2015 1 2 1232 2015 2 3 1233 2015 2 4 1234 2014 1 5 1235 2014 2 6 1231 2016 1 7 1232 2016 1 8 1233 2016 1 9 1236 2016 3 10 1237 2016 3 表,并将状态设置为3,将年份设置为2016。
  4. 因此,对于我上面列出的数据,我想要实现的最终结果是:

    CustDetails

    insert into CustDetails (CustNo, Year, StatusId)
        select 
            CustNo, 2016, StatusId
        from 
            CustDetails
        where 
            Year = 2015
    

    到目前为止,我有这个问题:

    UPDATE CustDetails 
    SET StatusId = 1  
    WHERE Year = 2016 AND StatusId = 2
    

    这涵盖了第1部分。我在上面的查询中没有为第2部分制定逻辑,我想我可以这样做:

    CustNo

    我再也没有为第3部分完成查询,但我想我可以获得ClaimDetails但不在CustDetails中的SELECT CustNo FROM ClaimDetails WHERE CustNo NOT IN (SELECT CustNo FROM CustDetails) <h2>Dinosaurs are cool.</h2> <script> document.querySelector('.change-text').addEventListener('click', function () { document.querySelector('h2').innerText = 'I AM A DINOSAUR!!!'; }); </script> <button class='change-text'>Change Text</button> 做类似的事情:

    $( document ).ready(function() {
        console.log( "ready!" );
    });
    

    然后分别对每个CustNo的ID进行创建。

    问题是这是执行此操作的最佳方式,还是应该首先复制到临时表。即使它们是两个独立的数据库,第三部分的查询也能正常工作 - 我想如果它们在同一台服务器上,只要我完全符合数据库的要求就可以正常运行。

1 个答案:

答案 0 :(得分:3)

实际上,在您的第二个查询中,您还将更新在执行第一个查询之前已存在的旧数据。所以我建议像这样使用CASE:

INSERT INTO CustDetails (CustNo, Year, StatusId)
SELECT CustNo, 2016, CASE WHEN StatusId = 2 THEN 1 ELSE StatusId END
FROM CustDetails
WHERE Year = 2015

使用INSERT INTO SELECT:

也可以类似地完成第三个查询
INSERT INTO CustDetails (CustNo, Year, StatusId)
SELECT CustNo, 2016, 3
FROM ClaimDetails
WHERE CustNo NOT IN (SELECT CustNo FROM CustDetails)

您必须完全限定数据库,包括模式名称 DatabaseName.SchemaName.TableName用于多数据库查询。