Вставка не скомпилирована - PullRequest
4 голосов
/ 05 июля 2010

Почему эта вставка не компилируется: -

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 ]

3 голосов
/ 05 июля 2010

MAX(ID) - агрегатная функция. Как и все агрегатные функции, требуется группировка по остальным полям. После предложения WHERE добавьте предложение group by во все остальные поля (псевдонимы).

Это общее правило, но для этого случая используйте решение Марка Байерса.

Другая идея - не делать 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
3 голосов
/ 05 июля 2010

Вы должны превратить ваше поле 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 является первичным ключом или имеет уникальное ограничение.

0 голосов
/ 05 июля 2010

Вы используете MAX(ID), это означает, что запрос использует группировку.Но вы не используете агрегатную функцию на UserGroupID, поэтому SQL не знает, какое значение выбрать из (возможных) значений.

Возможно, есть только одно значение, и вы это знаете, но компилятор SQL этого не знает.

Лучше обернуть UserGroupID также в MAX, MIN или другой агрегатной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...