开发者

Optional filter on a left join column

开发者 https://www.devze.com 2023-02-17 12:39 出处:网络
I\'m having issues wrapping my head around how to write a procedure that includes an optional filter on a left join.

I'm having issues wrapping my head around how to write a procedure that includes an optional filter on a left join.

I have two tables, Issues, and Customer_Location. Not all issues have been linked to a customer location. So I am fine with this as a starting point:

SELECT
  I.Issue_Number,
  C.Customer_Location_Code

FROM Issues I
LEFT JOIN Customer_Location C
  ON C.Customer_Location_Key = I.Customer_Location_Key


Issue_Number | Customer_Location_Code
1            | Chicago
2            | NULL
3            | Chicago
4            | New Yor开发者_开发问答k      

And this works, it gives me all the issues. But I want to add an optional parameter for the customer location code that if left null would return all 4 issues, but if set to say 1 for Chicago, only issue 1 and 3 would return.

I've tried this

DECLARE @customer_location_key INT
SET @customer_location_key = 1

SELECT
  I.Issue_Number,
  C.Customer_Location_Code

FROM Issues I
LEFT JOIN Customer_Location C
  ON C.Customer_Location_Key = I.Customer_Location_Key
 AND C.Customer_Location_Key = @customer_location_key

But I get the following results

Issue_Number | Customer_Location_Code
1            | Chicago
2            | NULL
3            | Chicago
4            | NULL

For some reason I seem to be having a brain fart right now and just can't seem to get my head around what SHOULD be something rather simple


Adding a where clause similar to below should do it.

DECLARE @customer_location_key INT
SET @customer_location_key = 1

SELECT
  I.Issue_Number,
  C.Customer_Location_Code

FROM Issues I
LEFT JOIN Customer_Location C
  ON C.Customer_Location_Key = I.Customer_Location_Key
where (@customer_location_key is null or C.Customer_Location_Key = @customer_location_key)


Use the where clause instead

DECLARE @customer_location_key INT
SET @customer_location_key = 1

SELECT
  I.Issue_Number,
  C.Customer_Location_Code

FROM Issues I
LEFT JOIN Customer_Location C
  ON C.Customer_Location_Key = I.Customer_Location_Key
WHERE
 (@customer_location_key is null OR C.Customer_Location_Key = @customer_location_key)


The reason that your query does not work as you expect is that first the 2 ON conditions are examined and then, because of the LEFT JOIN, all rows of table Issue that haven't been matched are added as well (with NULLs in the columns of table Customer_Location_Code).

DECLARE @customer_location_key INT
SET @customer_location_key = 1

SELECT
  I.Issue_Number,
  C.Customer_Location_Code

FROM Issues I
LEFT JOIN Customer_Location C
  ON C.Customer_Location_Key = I.Customer_Location_Key
WHERE ( @customer_location_key IS NULL )
   OR ( C.Customer_Location_Key = @customer_location_key )
0

精彩评论

暂无评论...
验证码 换一张
取 消