ПРИСОЕДИНЯЙТЕСЬ к таблице членства - PullRequest
0 голосов
/ 26 ноября 2010

Почему Microsoft использует глупые примеры с предложением GroupBy только для одной таблицы?

http://msdn.microsoft.com/en-us/library/bb896341.aspx

И почему возникает ошибка, когда я пытаюсь выбрать поле, которого нет в GroupBy? Ошибка говорит о том, что поля, которых нет в предложении GroupBy, не существуют в текущем контексте.

using (Entities db = new Entities())
{
    var query = "SELECT RLS.RoleId, UIR.UserId, UIR.RoleId, USR.UserName FROM Entities.aspnet_Roles AS RLS " +
                 "INNER JOIN Entities.vw_aspnet_UsersInRoles AS UIR " +
                 "ON RLS.RoleId = UIR.RoleId " + 
                 "INNER JOIN Entities.aspnet_Users AS USR " + 
                 "ON UIR.UserId = USR.UserId " + 
                 //"GROUP BY RLS.RoleId"  // is uncomment - it says UserId doesn't exist in context
                 ;
    var x = new ObjectQuery<DbDataRecord>(query, db);
    var y = x.ToTraceString().Replace("\n", " ").Replace("\t", " ").Replace("\r", " ");
}

То же самое для LINQ:

var x = from RLS in db.aspnet_Roles
                        join URS in db.vw_aspnet_UsersInRoles
                        on RLS.RoleId equals URS.RoleId
                        join USR in db.aspnet_Users
                        on URS.UserId equals USR.UserId
                        group RLS by RLS.RoleId into GRP
                        select new
                        {
                            GRP.Key
                        };

Вопрос: как выбрать все поля и выбрать GroupBy только по одному полю?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 26 ноября 2010

Все поля, не входящие в предложение GROUP BY, должны быть агрегированными выражениями, такими как AVG(...) или SUM(...) или MAX(...) и т. Д.

Так что это неправильно:

SELECT RLS.RoleId, UIR.UserId, UIR.RoleId, USR.UserName
(...)
GROUP BY RLS.RoleId

потому что последние три выражения в SELECT должны быть как-то агрегированы или добавлены в предложение GROUP BY.

Это логично, потому что, указав GROUP BY RLS.RoleId, вы говорите, что RLS.RoleId долженбыть уникальным в конечном результате, поэтому только одна строка на значение.Но для каждого RLS.RoleID может быть несколько значений для UIR.UserId, UIR.RoleId или USR.UserName.Поэтому вам нужно указать СУБД, что нужно сделать, чтобы сделать их одной строкой: среднее, максимальное, минимальное ... ИЛИ вы добавляете поля в предложение GROUP BY, чтобы не RLS.RoleID, а комбинация значений столбцов должны быть уникальными.Смотрите также этот пример .

1 голос
/ 26 ноября 2010

Я не вижу каких-либо агрегатных функций (COUNT, SUM, AVG и т. Д.), Используемых в отправленном запросе. Таким образом, нет необходимости включать выражение GROUP BY, и на самом деле нет причин для этого. Не могли бы вы объяснить, что вы пытаетесь достичь?

0 голосов
/ 27 ноября 2010

Кажется, я не понял littlegreen . Его совет действительно помог ... хотя я был расстроен SQL Server по сравнению с MySQL (достаточно установить одно поле группировки).

Works!

SELECT DISTINCT 
   RLS.RoleId, 
   COUNT(RLS.RoleId) AS RID_CNT, 
   MAX(CAST(UIR.UserId AS VARCHAR(36))) AS EXPR1, 
   MAX(CAST(USR.UserName AS VARCHAR(36))) AS EXPR2
FROM aspnet_Roles AS RLS 
INNER JOIN vw_aspnet_UsersInRoles AS UIR ON RLS.RoleId = UIR.RoleId 
INNER JOIN aspnet_Users AS USR ON UIR.UserId = USR.UserId
GROUP BY RLS.RoleId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...