我有一个名为 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
的表(不要问我为什么这些表不在同一个数据库中)但设计决定是在我加入之前做出的,我无法改变。)
数据类似于下面(为了简洁起见,再次删除了其中一些数据)
claim 详细信息:
ID ClaimNumber CustNo
----------------------
1 1 1231
2 2 1232
3 3 1236
4 4 1237
我有几件事要完成:
- 复制
CustDetails
中年份为 2015 年的所有行,并将年份更改为 2016 - 如果第 1 部分结果中的状态为 2,则将 2016 年的状态设置为 1
- 创建一个否定列表,以查找位于
ClaimDetails
表中但不在CustDetails
表中的CustNo
- 对于这些在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 部分的查询,但我想我可以获得 ClaimDetails
中但不在 中的
通过执行以下操作:CustNo
。 CustDetails
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.TableName
用于多数据库查询。
关于sql - 将数据从 SQL Server 表复制到同一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39068329/