我正在编写一个包含报告文件,员工文件和报告分发文件的查询。我想要一个员工姓名列表,每个名称都包含每个报告名称,如果他们没有得到报告则为0,如果他们收到报告,则为1。
select distinct ut.user_name
, ut.emailaddress
, r.name
, iif(ISNULL(rd.employeeid,0)=0, 0,1) AS currentreport
from US_usertable ut
cross join DL_reports r
left outer join DL_Reptdistrib rd
on ut.employeeID = rd.employeeid
对于每个用户,我会得到一套完整的报告 - 因此交叉加入有效 - 但要么所有报告都获得1,要么所有报告都得0。我不明白为什么这个查询不起作用。如果可以,请帮助。在此先感谢!!!
答案 0 :(得分:4)
我认为您错过了报告的加入条件:
select ut.user_name, ut.emailaddress, r.name,
(case when rd.employeeid is null then 0 else 1 end) as currentreport
from US_usertable ut cross join
DL_reports r left outer join
DL_Reptdistrib rd
on ut.employeeID = rd.employeeid and r.?? = rd.??;
??
用于标识报告的字段。我猜可能是reportID
。
注意:我将语法切换为标准SQL。 IIF()
在SQL Server中与MS Access兼容(为什么Microsoft没有在MS Access中放置ANSI标准case
超出我的意思)。我还将ISNULL()
替换为ANSI标准IS NULL
。