插入未编译

时间:2010-07-05 08:29:27

标签: asp.net sql

为什么这个插入没有被编译: -

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子句。

3 个答案:

答案 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包裹在MAXMIN或其他聚合函数中。