为什么这个插入没有被编译: -
INSERT INTO dbo.UserGroupsToUsers
( UserID ,
LastUpdated ,
ID ,
UserGroupID
)
SELECT @MergeToUserID ,
GETDATE() ,
MAX(ID) + 1 ,
UserGroupID
FROM dbo.UserGroupsToUsers
WHERE UserID = @MergeFromUserID
错误:列'dbo.UserGroupsToUsers.UserGroupID'在选择列表中无效,因为它不包含在聚合函数中,并且没有GROUP BY子句。
答案 0 :(得分:3)
您应该将ID
字段变为IDENTITY(自动增量字段)并从查询中省略它。
如果您无法更改数据库,可以试试这个:
INSERT INTO dbo.UserGroupsToUsers
( UserID ,
LastUpdated ,
ID ,
UserGroupID
)
SELECT @MergeToUserID ,
GETDATE() ,
(SELECT MAX(ID) + 1 FROM dbo.UserGroupsToUsers),
UserGroupID
FROM dbo.UserGroupsToUsers
WHERE UserID = @MergeFromUserID
重要说明:这假设只返回一行。如果子查询返回多行并且ID是主键或具有唯一约束,则插入将失败。
答案 1 :(得分:3)
MAX(ID)
是一个聚合函数。与所有聚合函数一样,它需要对其余字段进行分组。
在WHERE
子句之后,在所有其他字段(别名)上添加group by
子句。
这是一般性的,但对于这种情况,请使用Mark Byers解决方案。
另一个想法是不做MAX(),而是这样:
INSERT INTO dbo.UserGroupsToUsers
( UserID ,
LastUpdated ,
ID ,
UserGroupID
)
SELECT TOP 1 @MergeToUserID ,
GETDATE() ,
ID +1,
(SELECT UserGroupID FROM dbo.UserGroupsToUsers WHERE UserID = @MergeFromUserID)
FROM dbo.UserGroupsToUsers
ORDER BY ID DESC
答案 2 :(得分:0)
您使用MAX(ID)
,这意味着查询使用分组。但是你没有在UserGroupID
上使用聚合函数,所以SQL不知道从(可能的)值中选择什么值。
可能只有一个值,你知道,但SQL编译器不知道。
最好还将UserGroupID
包裹在MAX
,MIN
或其他聚合函数中。