如何在不指定列名的情况下从另一个表更新一个表?

Posted

技术标签:

【中文标题】如何在不指定列名的情况下从另一个表更新一个表?【英文标题】:How to update one table from another one without specifying column names? 【发布时间】:2011-04-22 22:46:14 【问题描述】:

我有两个具有相同结构和非常大数量的字段(大约 1000 个)的表。我需要执行 2 个操作 1)将第二个表中的所有行插入到第一个表中。示例:

INSERT INTO [1607348182]
SELECT * 
FROM _tmp_1607348182;

2) 从第二个表更新第一个表 但是对于更新,我找不到合适的更新 sql 语法。

类似的查询:

Update [1607348182]
set [1607348182].* = tmp.*
from [1607348182]
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid

Update [1607348182]
from [1607348182]
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid

无效。

【问题讨论】:

我建议使用TRIGGER 或修改您的架构,这样您就不必这样做了。 我不明白。在您第一次更新后,这两个表将包含相同的行,那么您希望第二次更新会做什么? Travis G,我同意你修改数据库架构,但不幸的是我应该在我的项目中遵循这个架构。 PaulG:我描述了我需要的两种可能的操作 【参考方案1】:

是否可以从主表中删除所有在 temp 中具有 ID 的内容,然后使用新数据进行插入?

【讨论】:

是的,我意识到了这个解决方案并实施了它。谢谢【参考方案2】:

不确定您是否能够在不使用动态 sql 在变量中构建更新语句的情况下完成此操作。

此语句将根据您输入的表名返回一个列列表:

select name from syscolumns
where [id] = (select [id] from sysobjects where name = 'tablename')

不确定我是否可以在这里避免循环......您需要将上面的结果加载到游标中,然后从中构建查询。伪编码:

set @query = 'update [1607348182] set '
load cursor --(we will use @name to hold the column name)
while stillrecordsincursor
set @query = @query + @name + ' = tmp_[1607348182]. ' +@name + ','
load next value from cursor
loop!

在循环中完成查询后,使用 exec sp_executesql @query。

只是一个小警告...在这样的循环中构建动态 sql 可能会有点混乱。对于故障排除,将 select @query 放入循环中并观察 @query 的构建。

编辑: 不确定您是否能够一次更新所有 1000 行...@query 也可以增长的大小存在逻辑限制(varchar(8000)?)。您可能必须划分代码,以便一次处理 50 列。将 syscolumns select 语句中的列放入带有 id 的临时表中,并构建您的动态 sql,以便一次更新 20 列(或 50 列?)。

另一种选择是使用 excel 来批量构建它。选择列并将结果复制到电子表格的 a 列中。将 '= 放入 b 列,tmp.[12331312]在 c 列中,将 a 列复制到 D 列,将逗号复制到 e 列。将整个电子表格复制到记事本中,您应该已经为您构建了更新语句的列。如果这是一次性事件,这是一个不错的解决方案,不确定我是否会依赖它作为持续的解决方案。

【讨论】:

这似乎是最好的解决方案,因为 sql 中没有本地表达式可以做到这一点。我也遇到了与可变大小列相关的 SQL Server 的其他限制。 (我也意识到我的问题源于糟糕的 DB 架构)所以你的解决方案似乎是最好的,因为我可以缓存这个 SQL 语句并稍后在其他请求中重用。 关于 varchar(8000) 限制。无论如何我都可以创建 varchar(MAX) 好点,我最近一直在使用遗留数据库,忘记了 varchar(max)。关于糟糕的数据库架构...我假设您正在使用旧架构(很少看到平面文件/IDBMS 之外的名为数字的表)。每晚从遗留系统导入规范化数据库可能是一个不错的选择,否则您会花费相对大量的时间来处理这个糟糕的架构,这些架构将添加到您所做的每个项目中。

以上是关于如何在不指定列名的情况下从另一个表更新一个表?的主要内容,如果未能解决你的问题,请参考以下文章

Dart - 一个 dart 项目如何在不使用 pub 的情况下从另一个 dart 项目导入代码?

如何在不打开的情况下从 CSV 文件中检索数据

Angular 4在不使用服务的情况下从另一个组件执行功能

如何在不影响 phpMyAdmin 的情况下从 mysql 中巧妙地删除 pma 表

如何在不导入的情况下从 .dmp 文件中列出 Oracle 中的所有模式和表空间?

如何在不创建快照的情况下从 cassandra 表中删除所有记录