ywj_1211 发表于 2023-12-19 12:10

请教一个sqlserver 数据库 update/替换的问题

请教一个sqlserver 数据库 update/替换问题
同一个表有两条数据
数据1:a b c d e f g ...数据2:a b c d e f g   ...(大概有一百多个字段)
怎么把数据2除了ab 字段之外的数据全部更新到数据1那行

Pojie1999.0909 发表于 2023-12-19 16:45

你可以使用SQL Server的UPDATE语句配合CASE表达式来实现这个需求。假设你的表名为`YourTable`,并且你想更新ID为1(这是数据1的行)的记录,用ID为2(这是数据2的行)的记录中的相应字段值替换除'a'和'b'字段之外的所有字段。以下是一个示例:

```sql
UPDATE YourTable
SET
    c = (SELECT c FROM YourTable WHERE ID = 2),
    d = (SELECT d FROM YourTable WHERE ID = 2),
    e = (SELECT e FROM YourTable WHERE ID = 2),
    -- ... 对所有需要更新的字段重复这个模式,除了a和b字段
    g = (SELECT g FROM YourTable WHERE ID = 2)
-- ... 更多字段
WHERE ID = 1;
```

然而,如果你有一百多个字段,手动编写这样的更新语句会非常繁琐。在这种情况下,你可能需要编写一个动态SQL脚本,根据表结构自动生成UPDATE语句。以下是一个基本的示例:

```sql
DECLARE @columns NVARCHAR(MAX);
DECLARE @updateSql NVARCHAR(MAX);

-- 获取除a和b字段之外的所有列名
SELECT @columns = STRING_AGG(QUOTENAME(c.name), ',')
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE t.name = 'YourTable' AND c.name NOT IN ('a', 'b');

-- 构建UPDATE语句
SET @updateSql = N'
UPDATE YourTable
SET ' + @columns + '
= (
    SELECT ' + @columns + '
    FROM YourTable AS t2
    WHERE t2.ID = 2
)
WHERE ID = 1;
';

-- 执行更新语句
EXEC sp_executesql @updateSql;
```

请注意,这个动态SQL示例使用了SQL Server 2017及更高版本的`STRING_AGG`函数。如果你使用的是早期版本的SQL Server,你可能需要使用其他方法来构建列名字符串,如`FOR XML PATH`技巧。

在实际应用中,请确保正确替换 `'YourTable'` 为你的实际表名,并考虑任何可能存在的并发更新或数据一致性问题。

weiyuhero 发表于 2023-12-19 17:09

本帖最后由 weiyuhero 于 2023-12-19 17:11 编辑

insert into表名   a,b,c,d,e,f,g....   selectc,d,e,f,g....from 表名    不知道你描述的是不是这个意思

ywj_1211 发表于 2023-12-20 08:57

Pojie1999.0909 发表于 2023-12-19 16:45
你可以使用SQL Server的UPDATE语句配合CASE表达式来实现这个需求。假设你的表名为`YourTable`,并且你想更 ...

多谢指点
页: [1]
查看完整版本: 请教一个sqlserver 数据库 update/替换的问题