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

时间:2013-04-17 13:59:05

标签: sql oracle

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

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

那么,有没有办法复制整行,更改一些已知/常量的列子集,并重新插入它而不显式列出所有列?唯一的解决方案是使用从架构收集的DDL信息动态构建查询吗?

2 个答案:

答案 0 :(得分:1)

注意:此答案适用于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

答案 1 :(得分:1)

我认为您可以通过create table as(或select into)和更新的组合来做您想做的事。

所以,创建一个表的副本:

create table newTable as
    select *
    from oldTable

或者,取决于您的数据库:

select *
into newTable
from oldTable

然后使用update进行更改:

update newTable
    set col2 = col1,
        code = (case when code = 'bad' then good else code end)