我有一张订单表,
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')