我正在尝试在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个文件)。
答案 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;
此版本的性能可能会更好。