Oracle SQl Dev, отображение идентификатора, имени, фамилии и количества пользователей файлов - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь написать запрос в Oracle оратор SQL, который будет перечислять UNum, FirstName, Surname и количество файлов, которые есть у пользователей, если у пользователя 0, оно должно отображаться как 0 рядом с его именем.

(PK) = Primary Key
(FK) = Foreign Key

Схема базы данных выглядит следующим образом:

Building(buildingNum(PK), Description, instname, buildName, state, postcode)
User(UNum(PK), buildingNum(FK), Surname, FirstName, initials, title)
File(FileNum(PK), title)
UserAccount(FileNum(PK)(FK), UNum(PK)(FK))
Job(JobNum(PK), id, title)
Interest(JobNum(PK)(FK), UNum(PK)(FK), Description)

До сих пор я пробовал следующий блок кода:

Select User.UNum, User.FirstName, User.Surname, Count(UserAccount.FileNum)
from User, UserAccount
where User.UNum = UserAccount.UNum
group by User.UNum, User.FirstName, User.Surname;

В результате я получаю длинный список пользователей, состоящий из UNum, FirstName и Surname, а затем количество файлов, которые у них есть, однако ни один из результатов не возвращается с 0. Список также кажется слишком длинным для размера базы данных. Как найти тех, у кого также есть 0 файлов и что-то еще я делаю не так? ожидаемый результат должен быть намного более коротким списком пользователей, включая тех, у кого нет файлов (в базе данных 7 человек с 0 файлами) Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Вы хотите left join:

Select u.UNum, u.FirstName, u.Surname, 
       Count(ua.FileNum)
from User u left join
     UserAccount ua
     on u.UNum = ua.UNum
group by u.UNum, u.FirstName, u.Surname;

Здесь также представлены псевдонимы таблиц, что упрощает написание и чтение запросов.

Вы также можете написать это, используя коррелированный подзапрос:

select u.UNum, u.FirstName, u.Surname, 
       (select count(ua.FileNum)
        from UserAccount ua
        where u.UNum = ua.UNum
       )
from User u;

Эта версия может иметь несколько лучшую производительность.

0 голосов
/ 20 мая 2019

Вы хотите присоединиться слева.Это сохраняет строки в таблице слева от оператора соединения, даже если в таблице справа от нее не найдено подходящей строки.

SELECT user.unum,
       user.firstname,
       user.surname,
       count(useraccount.filenum)
       FROM user
            LEFT JOIN useraccount
                      ON useraccount.unum = user.unum
       GROUP BY user.unum,
                user.firstname,
                user.surname;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...