繁体   English   中英

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

[英]Copy data from SQL Server table to same table

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

客户详情

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. 复制CustDetails中年份为2015的所有行, CustDetails年份更改为2016
  2. 如果第1部分的结果中的状态为2,则将其设置为2016年的1
  3. 从创建找否定列表CustNo的这些都是ClaimDetails表,但不是在CustDetails表-这些创造了一个新的行CustDetails表和状态,以3年制定到2016年。

因此,对于我上面列出的数据,我想要获得的最终结果是:

客户详情

    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

到目前为止,我有这个查询:

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

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

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

同样,我没有对第3部分进行查询,但是我想我可以通过执行以下操作来获取ClaimDetailsCustNo ,而不是CustDetailsCustNo

SELECT CustNo 
FROM ClaimDetails
WHERE CustNo NOT IN (SELECT CustNo FROM CustDetails)

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

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

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

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.TableNameDatabaseName.SchemaName.TableName

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM