Дополнительный фильтр в левом столбце соединения - PullRequest
3 голосов
/ 17 марта 2011

У меня возникли проблемы, связанные с написанием процедуры, включающей дополнительный фильтр для левого соединения.

У меня есть две таблицы: Issues и Customer_Location. Не все проблемы были связаны с местонахождением клиента. Так что я согласен с этим в качестве отправной точки:

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 York      

И это работает, это дает мне все проблемы. Но я хочу добавить необязательный параметр для кода местоположения клиента, который, если оставить пустым, вернул бы все 4 проблемы, но если задать значение 1 для Чикаго, вернутся только проблемы 1 и 3.

Я пробовал это

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

Но я получаю следующие результаты

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

По какой-то причине у меня сейчас пукнет мозг, и я просто не могу понять, что ДОЛЖНО быть чем-то довольно простым

Ответы [ 3 ]

3 голосов
/ 17 марта 2011

Вместо этого используйте предложение where

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)
3 голосов
/ 17 марта 2011

Добавление предложения where, аналогичного приведенному ниже, должно сделать это.

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)
2 голосов
/ 17 марта 2011

Причина, по которой ваш запрос не работает должным образом, заключается в том, что сначала проверяются условия 2 ON, а затем, из-за LEFT JOIN, добавляются все строки таблицы Issue, которые не были сопоставлены а также (с NULL в столбцах таблицы 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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...