Запрос не возвращает результатов, если строка моего счета равна 0 - PullRequest
0 голосов
/ 28 августа 2018

У меня есть база пользователей. Я хочу вернуть информацию, включая количество групп, в которых они находятся. Я делаю следующий запрос SQL

SELECT dbo.Users.UserId AS 'userId', 
       dbo.Users.UserName AS 'firstName', 
       dbo.Users.Surname AS 'surname', 
       dbo.Users.Photograph AS 'photograph', 
       dbo.Users.JobTitle AS 'jobTitle', 
       dbo.Users.EmailAddress AS 'emailAddress', 
       dbo.Users.Inactive AS 'inactive', 
       COUNT(dbo.UserGroups.userId) AS 'teams'
 FROM dbo.Users, 
       dbo.UserGroups
 WHERE dbo.Users.UserId = 27 
       AND dbo.UserGroups.UserId = dbo.Users.UserId
 GROUP BY dbo.Users.UserId, 
       dbo.Users.UserName, 
       dbo.Users.Surname, 
       dbo.Users.Photograph, 
       dbo.Users.JobTitle, 
       dbo.Users.EmailAddress, 
       dbo.Users.Inactive

Это не даст результатов, так как идентификатор пользователя 27 отсутствует в каких-либо группах, когда должна отображаться другая информация, а строка групп / команд должна быть 0.

Это прекрасно работает с пользователями, входящими в группу или несколько групп

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Может быть, потому что вы используете неявное INNER JOIN ... используйте явное LEFT JOIN.

Попробуйте это:

SELECT dbo.Users.UserId AS 'userId', 
       dbo.Users.UserName AS 'firstName', 
       dbo.Users.Surname AS 'surname', 
       dbo.Users.Photograph AS 'photograph', 
       dbo.Users.JobTitle AS 'jobTitle', 
       dbo.Users.EmailAddress AS 'emailAddress', 
       dbo.Users.Inactive AS 'inactive', 
       COALESCE(COUNT(dbo.UserGroups.userId), 0) AS 'teams'
 FROM dbo.Users left join
       dbo.UserGroups on dbo.UserGroups.UserId = dbo.Users.UserId
 WHERE dbo.Users.UserId = 27  
 GROUP BY dbo.Users.UserId, 
       dbo.Users.UserName, 
       dbo.Users.Surname, 
       dbo.Users.Photograph, 
       dbo.Users.JobTitle, 
       dbo.Users.EmailAddress, 
       dbo.Users.Inactive
0 голосов
/ 28 августа 2018

Я собираюсь предложить коррелированный подзапрос:

SELECT u.*,
       (SELECT COUNT(*) FROM dbo.UserGroups ug WHERE ug.UserId = u.UserId) as teams
FROM dbo.Users u 
WHERE u.UserId = 27 ;

Почему я предпочитаю такой подход?

  • Это упрощает запрос. Вам не нужно перечислять все столбцы в GROUP BY.
  • Поскольку нет внешнего GROUP BY, это может быть наибольшая производительность в большинстве баз данных (при условии индекса на UserGroups(UserId)).
  • Обратите внимание на использование псевдонимов таблиц для упрощения запроса.
0 голосов
/ 28 августа 2018

Вы должны использовать left join вместо неявного inner join:

SELECT dbo.Users.UserId AS 'userId', 
       dbo.Users.UserName AS 'firstName', 
       dbo.Users.Surname AS 'surname', 
       dbo.Users.Photograph AS 'photograph', 
       dbo.Users.JobTitle AS 'jobTitle', 
       dbo.Users.EmailAddress AS 'emailAddress', 
       dbo.Users.Inactive AS 'inactive', 
       COUNT(dbo.UserGroups.userId) AS 'teams'
 FROM dbo.Users
 LEFT JOIN dbo.UserGroups ON dbo.UserGroups.UserId = dbo.Users.UserId
 WHERE dbo.Users.UserId = 27 
 GROUP BY dbo.Users.UserId, 
       dbo.Users.UserName, 
       dbo.Users.Surname, 
       dbo.Users.Photograph, 
       dbo.Users.JobTitle, 
       dbo.Users.EmailAddress, 
       dbo.Users.Inactive
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...