【问题标题】:insert into by select from another table通过从另一个表中选择插入
【发布时间】:2023-12-22 18:36:01
【问题描述】:

表 A:

ID | Name | Phone 

ID(主键)

表 B:

tableaA_ID | Name | serial

tableaA_ID 和序列号(主键)

SQL 语句:

insert into Table_B (tableaA_ID  , Name  , serial  )
select ID , Name , ( select  ISNULL(MAX(serial),0)+1 from table_B ) 
from Table_A

从另一个数据中选择数据插入是如何工作的,它的工作方式类似于 for 语句?

因为我尝试将数据从表 A 插入到表 B 中

但我收到错误消息 Cannot insert duplicate key (ID , serial )=> (1,1) 因为序列总是返回相同的值。

【问题讨论】:

    标签: sql sql-server ado.net


    【解决方案1】:

    您在select 中选择一个 最大值,这导致了问题。所以,使用row_number() 来增加它:

    insert into Table_B (tableaA_ID , Name, serial  )
        select ID , Name ,
               COALESCE(bb.serial, 0) + row_number() over (order by id)
        from Table_A CROSS JOIN
             (SELECT MAX(serial) FROM table_b) bb;
    

    也就是说,这通常是一种反模式,您应该使用 identity/auto_increment/serial 或类似的列来自动分配值。

    【讨论】:

    • 亲爱的,为什么它在我的脚本中不能正常工作?假设表有两行,当我尝试将值插入另一个表时,序列必须在第一次 1 和第二次 2 中,但为什么总是返回 1?
    • @QaisAlmomany 。 . .您的代码不起作用,因为 max() 为查询执行一次。不过,真正的解决方案是使用identity 列。
    最近更新 更多