基于多个条件的SQL JOIN查询

时间:2018-07-17 15:52:59

标签: sql sql-server

根据我的表映射,Company可以有许多Contacts。因此CompanyIdContact表中的外键。

Contact表的列ContactType可以是MainContact(值1),AccountsContact(值2),EmailContact(值3)等

我只是想编写一个SQL查询,该查询将根据以下条件的第一个EmailContact(考虑最低的Contact主键ID)的条件返回所有不同的公司以及联系信息Company,但如果没有电子邮件联系人,则“主要”联系人的信息

示例行

  • Company1信息->联系人信息(第一个“ EmailContact”,如果找不到“ MainContact”)
  • Company2信息->联系信息(第一个“ EmailContact”,如果找不到“ MainContact”)

示例

|CompanyId | CompanyName|
    1          ABC Ltd
    2          XYZ Ltd
    3          CCC Ltd


|ContactId | ContactType | EmailAddress     | CompanyId
     1          1          jay@gmail.com       1
     2          3          jim@gmail.com       1
     3          3          ray@gmail.com       2
     4          3          bill@gmail.com      2
     5          1          sally@gmail.com     3

预期查询结果

CompanyID | CompanyName | ContactId | ContactType |   EmailAddress  | CompanyId
    1         ABC Ltd        2          3           jim@gmail.com       1                   - This loaded EmailContact over MainContact 
    2         XYZ Ltd        3          3           ray@gmail.com       2                   - This considered to load first EmailContact
    3         CCC Ltd        5          1           sally@gmail.com     3                   - This loaded MainContact as no EmailContacts at all

1 个答案:

答案 0 :(得分:2)

也许您需要apply

select cm.*, cn.*
from Company cm outer apply
     (select top (1) cn.*
      from Contacts cn
      where cn.CompanyID  = cm.CompanyID 
      order by (case when cn.ContactType = 3 then 0 
                     when cn.ContactType = 1 then 1 
                     else 2
                end)
     ) cn;