我有一个数据表作为存储过程的参数。我正在将数据从该数据表插入表中。
表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
我该如何实现?
答案 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()
,然后递增。