获取id是否存在的数据

时间:2016-05-28 21:38:54

标签: sql sql-server

我有一个名为SubDivision的表,其中包含

  • SubDivisionID
  • SubDivisionName
  • 路线

然后我有一个名为CustomerSubDivisionXREF的表,其中包含此

  • CustomerSubDivisionXREFID
  • SubDivisionID
  • 客户id

我的存储过程如下所示

select
    sub.SubDivisionID,
    sub.SubDivisionName,
    csxref.SubDivisionID as "Assigned"
from [SubDivision] sub
    left join [CustomerSubDivisionXREF] csxref on csxref.SubDivisionID = sub.SubDivisionID

这将返回Assigned的所有SubDivisions和null,这很好,看起来像这样..

What is returned

然而,一旦我介绍了

where csxref.CustomerID = 9

然后什么都没有回来,我理解为什么。但问题是,无论是否分配给客户,我如何获得所有SubDivisions?所以我想简而言之,我想传递一个CustomerID,如果没有为该CustomerID分配SubDivisions,那么我希望它仍然能够返回我在图片中显示的内容。

修改

我忘了提到我必须将CustomerID传递给此存储过程。

2 个答案:

答案 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子句更易读,因为您可以清楚地看到只有子查询的记录是受限制的,但我不确定一个表现是否优于其他开箱即用。