我有一个名为SubDivision
的表,其中包含
然后我有一个名为CustomerSubDivisionXREF
的表,其中包含此
我的存储过程如下所示
select
sub.SubDivisionID,
sub.SubDivisionName,
csxref.SubDivisionID as "Assigned"
from [SubDivision] sub
left join [CustomerSubDivisionXREF] csxref on csxref.SubDivisionID = sub.SubDivisionID
这将返回Assigned的所有SubDivisions
和null,这很好,看起来像这样..
然而,一旦我介绍了
where csxref.CustomerID = 9
然后什么都没有回来,我理解为什么。但问题是,无论是否分配给客户,我如何获得所有SubDivisions?所以我想简而言之,我想传递一个CustomerID,如果没有为该CustomerID分配SubDivisions,那么我希望它仍然能够返回我在图片中显示的内容。
修改
我忘了提到我必须将CustomerID传递给此存储过程。
答案 0 :(得分:1)
您需要将该条件放在on
子句中:
select sub.SubDivisionID, sub.SubDivisionName,
csxref.SubDivisionID as "Assigned"
from [SubDivision] sub left join
[CustomerSubDivisionXREF] csxref
on csxref.SubDivisionID = sub.SubDivisionID and
csxref.CustomerID = 9;
通过将其放在where
子句中,您将联接转换为inner join
- 因为不匹配的行获得NULL
并且无法进行比较。
答案 1 :(得分:0)
或者使用子查询:
SELECT sub.SubDivisionID, sub.SubDivisionName, csxref.SubDivisionID AS Assigned
FROM SubDivision AS sub
LEFT JOIN (
SELECT t.SubDivision
FROM CustomerSubDivisionXREF AS t
WHERE t.CustomerID = 9
) AS csxref ON sub.SubDivisionID = cxsref.SubDivisionID
对我而言,这比多谓词on
子句更易读,因为您可以清楚地看到只有子查询的记录是受限制的,但我不确定一个表现是否优于其他开箱即用。