返回可能存在各种空值组合的行

时间:2015-08-03 16:13:44

标签: sql-server tsql azure

我正在寻找提取符合各种标准的记录的最佳方法,作为一个结果集。我正在使用SQL Azure。

在一个稍微简化的示例中,这是我的方案(我附上了这部分模式的图表以帮助澄清!):

我在tblCourseStudents有学生出勤记录。一列是SponsorID - 这是"赞助"的人的ID。那个人的课程 - 通常,但不总是,他们的经理。这是一个外键,与tblPeople中的PersonID相关。但是,在许多情况下,此列为空,因为该公司在历史上始终没有记录该信息。

在tblPeople中,有一个CompanyID列,用于标识任何人工作的公司。还有一个名为IsPrimary(BIT)的列,对于被识别为该公司主要联系人的人,该列将设置为1。公司可能没有人成为小学的,但是这样的人永远不会超过一个人。

我想运行一个显示以下内容的查询:

  1. 学生详情,包括
  2. 赞助商的名称和电子邮件,如果赞助商ID不为空(如 "赞助商"),或者如果这是空的
  3. 此人的姓名和电子邮件地址 学生的公司标记为IsPrimary = True,这样的话 人存在,或
  4. 学生详细信息为"赞助商" 上述两者都不存在的细节。
  5. 有人可以帮忙吗?我现在已经盯着屏幕了很长时间。

    这是架构: Schema for the relevant portion of the database

2 个答案:

答案 0 :(得分:0)

请尝试此查询:

select 
S.*,
CASE 
    WHEN Sponsor.PersonID is not null or (Sponsor.PersonID is null and Contact.PersonID is null) 
    THEN Sponsor.fname +' '+Sponsor.lname ELSE Contact.fname +' '+Contact.lname 
END as Name,
CASE 
    WHEN Sponsor.PersonID is not null or (Sponsor.PersonID is null and Contact.PersonID is null) 
    THEN Sponsor.email ELSE Contact.email 
END as Email

from tblCourseStudents S 
    left join tblPeople Sponsor 
         on Sponsor.personID=S.SponsorID 
    left join tblPeople StudentCompany 
         on StudentCompany.personID=S.StudentID 
    left join tblPeople Contact 
         on Contact.CompanyID=StudentCompany.CompanyID 
         and Contact.IsPrimary=1

答案 1 :(得分:0)

这应该这样做,不需要CASE语句。

SELECT stud.Name, stud.Email,
     coalesce(sponsor.Name,'') SponsorName, coalesce(sponsor.Email,'') SponsorEmail
FROM tblCourseStudents cs
INNER JOIN tblPeople stud on stud.ID = cs.StudentID
LEFT JOIN tblPeople prime ON prime.CompanyID = stud.CompanyID AND prime.IsPrimary = 1
LEFT JOIN tblPeople sponsor on sponsor.ID = COALESCE(cs.SponsorID, prime.ID)

您可以进一步改进这一点,用一个APPLY运算符将两个JOIN替换为tblPeople。