根据另一个表的数据将数据从数据表插入表

时间:2019-11-20 08:37:09

标签: sql-server datatable insert

我有一个数据表作为存储过程的参数。我正在将数据从该数据表插入表中。

Invoice

ID     Version
----+---------
11      1    
20      1
11      2

数据表@invoiceData

ID
--
11
21

现在,我要将数据从@invoiceData插入到Invoice。如果ID中的@invoiceData存在于Invoice表中,则该ID的新记录将被添加,而Version则增加1。并且如果ID不存在Version将为1。

这就是我现在正在做的事情:

INSERT INTO [dbo].[Invoice] ([ID], [Version])
    SELECT 
        inv.ID,
        CASE 
           WHEN (SELECT 1 FROM dbo.Invoice iv WHERE iv.ID = inv.ID) IS NOT NULL               
              THEN (SELECT MAX (ISNULL(iv.VersionId, 0)) + 1 
                    FROM dbo.Invoice iv 
                    WHERE iv.ID = inv.ID)  
           ELSE 1 
        END,
    FROM
        @invoiceData inv

但是我遇到一个错误:

  

子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

我想要的输出:

Invoice

ID     Version
----+---------
11      1    
20      1
11      2
11      3
21      1

我该如何实现?

3 个答案:

答案 0 :(得分:1)

使用TOP

限制子查询的结果
INSERT INTO [dbo].[Invoice] (
    [ID],
    [Version]
)
SELECT 
    inv.ID,
    Case when 
            coalesce((select top 1 1 from dbo.Invoice iv where iv.ID = inv.ID), 0) != 0
        then 
            (select max(ISNULL (iv.VersionId, 0)) + 1 FROM dbo.Invoice iv WHERE iv.ID = inv.ID)  else 1 end,
    from @invoiceData inv

答案 1 :(得分:1)

INSERT INTO [dbo].[Invoice] (
    [ID],
    [Version]
)
SELECT 
    inv.ID,
    Case when (select TOP 1 ID from dbo.Invoice iv where iv.ID = inv.ID) is not null then (SELECT MAX (ISNULL (iv.VersionId, 0)) + 1 FROM dbo.Invoice iv WHERE iv.ID = inv.ID)  else 1 end,
    FROM @invoiceData inv

我认为...您正在丢失...表中排名靠前的1个值(ID)...

原因... 选择1返回多个值 ....这就是为什么 这类错误

  

但是我收到错误消息:子查询返回了多个值。这是   子查询遵循=,!=,<,<=,>,> =或以下情况时不允许   子查询用作表达式。

答案 2 :(得分:1)

只是:

INSERT INTO Invoice (ID, Version)
SELECT 
    inv.ID,
    (SELECT COALESCE(MAX(i1.Version), 0) + 1 FROM Invoice i1 where i1.ID = i.ID)
FROM @InvoiceData i

Rationale:使用不带group by子句的聚合函数的相关子查询将始终返回单行。如果给定的id已经存在,则取其最大值并递增。如果尚不存在,则MAX()返回NULL,我们将0转到COALESCE(),然后递增。

Demo on DB Fiddle