Oracle SQl Dev,显示标识,名字,姓氏和用户文件数

时间:2019-05-20 10:13:02

标签: sql oracle

我正在尝试在oracle sql开发人员中编写查询,该查询将列出 UNum,FirstName,Surname和用户拥有的文件数,如果用户为0,则应在其姓名旁边显示为0。

document.getElementById("forgotPassword").addEventListener('click', function(){
        alert("Button is disabled for 30sec")
        document.getElementById("forgotPassword").disabled = true;
        setTimeout(function(){document.getElementById("forgotPassword").disabled = false;},30000);
    })

数据库架构如下:

(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)

我最终得到的结果是一长串由UNum,FirstName和Surname组成的Users列表,后跟它们拥有的文件数,但是结果都不返回0。该列表似乎也很长数据库的大小。我如何找到那些也有0个文件的人,我在做别的事情吗?预期结果应该是用户列表简短得多,包括没有文件的用户(数据库中有7个人,有0个文件)。

2 个答案:

答案 0 :(得分:0)

您想要左联接。即使在连接运算符右侧的表中未找到匹配的行,也可以将其保留在连接运算符左侧的表中。

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;

答案 1 :(得分:0)

您想要一个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;

此版本的性能可能会更好。