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

标签 sql sql-server database

我有一个名为 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

我有几件事要完成:

  1. 复制 CustDetails 中年份为 2015 年的所有行,并将年份更改为 2016
  2. 如果第 1 部分结果中的状态为 2,则将 2016 年的状态设置为 1
  3. 创建一个否定列表,以查找位于 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/

相关文章:

mysql - 使用 CONCAT 函数添加到 mysql 列中的现有值?

c# - ExecuteNonQuery() 返回受影响的意外行数 C#

python - 检查服务器是否有一个带有表的数据库,其中包含我在 win 7 上的 SQL Server 2008 上需要的信息

database - 为什么 "joins"会降低大型分布式数据库系统的可扩展性?

sql - 有没有一种有效的方法来避免 SQL 中固定值的联合?

sql - Oracle:具有平面表中唯一项目的物化 View

mysql - 如何修复 "DriverManager.getConnection(connectionURL, UN, PW); "上的错误?

mysql - 加入表中两个不同字段的选择数据

php - 在 mysql id 上添加日期前缀

c# - 违反唯一键约束 - 无法插入重复键