我正在尝试编写一个将返回这些记录的查询:
select *
from [CloneConfiguration]
where InstrumentId = 2
并将它们插入到同一个表中,并更改以下列:
Id
- 新记录需要一个唯一的id
号码(因为它是主键而不是定义为自动增量)
Instrument id
- 将工具ID更改为其他数字(例如3)
我尝试了以下不起作用的查询。
INSERT INTO [CloneConfiguration]
SELECT
MAX(Id) + 1, 3,
[SourceCCy1Id], [SourceCCy2Id], [SourceProviderId],
[TargetCCy1Id], [TargetCCy2Id], [TargetProviderId], [Remark]
FROM
[CloneConfiguration]
WHERE
InstrumentId =2
错误:
列'CloneConfiguration.SourceCCy1Id'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
答案 0 :(得分:2)
您可以通过执行以下操作在单个查询中执行所需操作:
INSERT INTO [CloneConfiguration]
SELECT COALESCE(m.maxid + 1, 1), 3, [SourceCCy1Id], [SourceCCy2Id],
[SourceProviderId], [TargetCCy1Id], [TargetCCy2Id],
[TargetProviderId], [Remark]
FROM [CloneConfiguration] CROSS JOIN
(SELECT max(id) as maxid FROM CloneConfiguration) m
WHERE InstrumentId = 2 ;
如果您要插入多行,请同时使用row_number()
:
INSERT INTO [CloneConfiguration]
SELECT COALESCE(m.maxid, 0) + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
3, [SourceCCy1Id], [SourceCCy2Id],
[SourceProviderId], [TargetCCy1Id], [TargetCCy2Id],
[TargetProviderId], [Remark]
FROM [CloneConfiguration] CROSS JOIN
(SELECT max(id) as maxid FROM CloneConfiguration) m
WHERE InstrumentId = 2 ;
也就是说,正确的解决方案是将id定义为identity
列。然后数据库负责分配唯一的ID。您的查询也没有竞争条件。因此,如果只有一个用户,则上述工作,但如果有多个用户则可能失败。
答案 1 :(得分:1)
这是假设sql-server,但我想你无论如何都明白了这一点:
DECLARE @MAXID INT = (SELECT MAX(Id) FROM [CloneConfiguration]) -- You probably want to number from the highest Id regardless of InstrumentId
INSERT INTO [CloneConfiguration]
SELECT @MAXID + ROW_NUMBER() OVER(ORDER BY Id)
, 3
, [SourceCCy1Id]
, [SourceCCy2Id]
, [SourceProviderId]
, [TargetCCy1Id]
, [TargetCCy2Id]
, [TargetProviderId]
, [Remark]
FROM [CloneConfiguration]
WHERE InstrumentId=2
我们的想法是首先获取当前表中的MAX(Id),并根据所选的ID添加ROW_NUMBER
。
顺便说一句,为要插入的列命名也是一个好主意:
INSERT INTO [CloneConfiguration] (Id, InstrumentId...)
...