SQL使用’常量’连接表

我有一张订单表,

Invoice   Location    Customer Code   SalesPersonEmail
------------------------------------------------------
300001    001         CUS001          ?
300002    006         CUS002          ?

还有一个电子邮件组表,

Role              Email 
-----------------------------------------------------
Filtered_Group    Management@gmail.com;john@gmail.com

当Location = 001时,SalesPersonEmail必须是Filtered_Group的Email字段

所有其他地点的SalesPersonEmail必须是“Orders@gmail.com;”角色电子邮件No_Filter_Group.

我目前正在使用以下功能实现此目的,

SELECT i.Invoice, i.Location, i.[Customer Code], 
    CASE WHEN i.Location = 001 
         THEN f.Email 
         ELSE N'Orders@gmail.com;' + nf.Email as SalesPersonEmail
    END
FROM   Invoice i, RoleCodes f, RoleCodes nf
WHERE  f.Role = N'Filtered_Group' AND nf.Role = N'No_Filter_Group'

我的问题是角色表中的角色No_Filter_Group有时可能不存在,这导致上述查询什么都不返回.

如何正确连接这些表,如果表中不存在No_Filter_Group,那么仍然会从查询中返回具有Filtered_Group的SalesPersonEmail的行?

谢谢

最佳答案 一种相对简单的方法是使用LEFT JOIN并为您的位置添加特殊编号001,并在连接条件中添加特殊角色名称Filtered_Group和No_Filter_Group.

在此SQL Fiddle中,您可以在架构定义中注释/取消注释一行,以查看当RoleCodes具有No_Filter_Group行时以及何时不行时它的工作方式.

在任何情况下,查询都将返回Invoice表中的所有行.

SELECT
  Invoice.Invoice
  ,Invoice.Location
  ,Invoice.[Customer Code]
  ,CASE WHEN Invoice.Location = '001'
  THEN RoleCodes.Email
  ELSE 'Orders@gmail.com;' + ISNULL(RoleCodes.Email, '')
  END AS SalesPersonEmail
FROM
  Invoice
  LEFT JOIN RoleCodes ON
    (Invoice.Location = '001' 
    AND RoleCodes.Role = 'Filtered_Group')
    OR
    (Invoice.Location <> '001' 
    AND RoleCodes.Role = 'No_Filter_Group')
点赞