sql - 复制行并更改一小部分列?

标签 sql oracle

首先,让我先声明一下,我知道类似问题的 INSERT/SELECT 解决方案(请参阅 here),但它不适用于我的场景。

我正在寻找一种不需要明确列出所有列的解决方案,因为这些列是提前未知的。该查询将在数十个不同数据库中的同一个表上运行。所有数据库都有一个通用列的子集,但每个列也都有自己特定于该数据库的独特列。

那么,有没有一种方法可以复制整行,更改某些已知/恒定的列子集,然后在不显式列出所有列的情况下重新插入它?唯一的解决方案是使用从架构中收集的 DDL 信息动态构建查询吗?

最佳答案

注意:此答案适用于 SQL Server。 标签被添加到这个答案之后的问题

根据良好设计原则,我将假设您的表有一个 IDENTITY 列,该列也是主键。我们还假设它没有有计算列(或时间戳或任何需要更多操作的类型)。最后让我们假设您至少知道这个 ID 列的名称,这是标准的,例如“id”。

你可以使用这个顺序:

SELECT * INTO #tmp FROM tbl WHERE id = @copyfrom;
ALTER TABLE #tmp DROP COLUMN id;
UPDATE #tmp SET
   column1 = ...,
   column2 = ...,
   column3 = ...;  --- the subset of columns you want to change
INSERT tbl SELECT * FROM #tmp;

SQL Fiddle Demo

关于sql - 复制行并更改一小部分列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16062123/

相关文章:

sql - PostgreSQL 比较两个 timestamptz

php - Zend-Framework2。查询

java - Hibernate 与 HSQLDB 和 Oracle

sql - 为什么 sysdate 中的一天在 plsql 触发器中不适用于星期一?

sql - Where子句有整数范围吗?

sql - T-SQL:更新记录集的第一行

sql - 读取下一条记录 "NOT"上一条记录sql

mysql - 过滤没有特定值的行

oracle - 在Mac OS/X上安装Oracle Instantclient而不设置环境变量?

sql - Oracle SQL 中的 CASE .. WHEN 表达式