【问题标题】:Select, Modify and insert into the same table选择、修改和插入到同一个表中
【发布时间】:2012-03-26 21:02:30
【问题描述】:

选择一行、修改几列并将其插入同一个表的最简单方法是什么? 我正在尝试基于另一个插入新行。

【问题讨论】:

    标签: sql-server-2008 tsql


    【解决方案1】:
    INSERT INTO table2 (column1, column2, column3)
    SELECT column1, 'no', column3 FROM table2 WHERE column2 = 'yes'
    

    希望这对于您如何执行此操作更清楚一些。如您所见,我从 table2 中抓取了两列,对于另一列,我使用了文本值而不是 column2 的值。

    您可以使用的其他模式:

    组合一列和一些其他文本(假设该列已经是字符串数据类型。

    INSERT INTO table2 (column1, column2)
    SELECT column1 + 'no', column2 FROM table2 WHERE column2 = 'yes'
    

    将一列和一些文本组合在一起,一个例子是该列是字符串,一个例子不是。

    INSERT INTO table2 (column1, column2)
    SELECT column1 + 'no', 'A' + cast(column2 as Varchar (10)) FROM table2 WHERE column2 = 'yes'
    

    【讨论】:

    • 在任何情况下都不应在插入中使用通配符
    • 如何做同样的事情,但稍作修改。例如:我想插入 'column2 val + test' 而不是 'no' 我的意思是从 swlwcted 行中插入附加文本的值。
    • @Shashank.gupta40 我知道这是旧的,但作为参考,假设 column2 是“字符串”类型(varchar、nvarchar 等),您可以通过将列名视为一个变量并附加一个新字符串,例如column2 + 'test'.
    • 注意:在给出的示例中,如果条件“column2 = 'yes'”返回许多行,则将插入许多行。这可能很方便,但原始海报确实只询问了一行,所以这个注释是一个警告。
    • 如果没有SELECT 'no'WHERE column2 = 'yes',我们将陷入无限循环。
    【解决方案2】:
    INSERT INTO table(column1,column2) SELECT column1, const2 FROM table ...
    

    选择列表可能会混合复制的列(按名称)和更改的列(按所需的值)。

    【讨论】:

    • 澄清一下,将您的修改作为语句选择部分的一部分。
    • 这取决于您的需求。例如。假设你的主键是一个无意义的整数,列名 id 没有任何键分配机制(例如自增列);假设您想从 ID 作为 @source 传递的记录中复制 column1 的值,并将 column2 的值设置为作为 @param 传递的新值。然后使用两个参数执行以下命令:INSERT INTO t(id, column1, column2) SELECT m.id + 1, source.column1, @param FROM t m, t source WHERE source.id = @source AND m.id = (SELECT MAX(id) FROM t)
    • @Agzam - 另一方面,如果 id 列是自动递增的,那就简单多了:INSERT INTO t(column1, column2) SELECT source.column1, @param FROM t source WHERE source.id = @source
    【解决方案3】:

    说列是 int

    INSERT INTO table(column1,column2) SELECT column1 + 1, column2 -1 FROM table
    

    您可以将列相乘并执行字符串函数。

    【讨论】:

    • 首先出现表为空的情况如何解决?
    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多