SQL Server - выберите левое соединение NULL-запись ГДЕ условие - PullRequest
3 голосов
/ 16 августа 2011

Я пытаюсь выполнить запрос SELECT для двух таблиц, объединенных с помощью LEFT JOIN, где в объединенной таблице может отсутствовать запись. Что-то вроде:

--SELECT row using AreaID
SELECT *
FROM Rate
LEFT JOIN Area
ON Rate.AreaID = Area.AreaID
WHERE ProductID = @ProductID
AND Area.PostcodeOutcode = @PostcodeOutcode

Это работает, когда @PostcodeOutcode существует в таблице Area, но мне все еще нужно вернуть запись в левой таблице, если в правой таблице нет записи.

Я сейчас этим занимаюсь, но знаю, что есть лучшее решение:

DECLARE @AreaID int
SELECT @AreaID = AreaID
FROM Area WHERE PostcodeOutcode = @PostcodeOutcode 

--SELECT row using AreaID
SELECT *
FROM Rate
WHERE ProductID = @ProductID
AND
(
    AreaID = @AreaID
    OR (@AreaID IS NULL AND AreaID IS NULL)
)

Я знаю, что это, вероятно, просто, но мои знания SQL ограничены. Пожалуйста, помогите.

Спасибо

Alex

Ответы [ 2 ]

5 голосов
/ 16 августа 2011

переместить проверку области в объединение

SELECT * FROM Rate
LEFT JOIN Area 
  ON Rate.AreaID = Area.AreaID and Area.PostcodeOutcode = @PostcodeOutcode
WHERE ProductID = @ProductID 

Обновление для исправленного вопроса в комментариях. Это то, что вы хотите?

SELECT Rate.RatePercent FROM Rate
INNER JOIN Area 
  ON Rate.AreaID = Area.AreaID and Area.PostcodeOutcode = @PostcodeOutcode
WHERE 
  ProductID = @ProductID
UNION ALL
SELECT Rate.RatePercent FROM Rate 
where
  ProductID = @ProductID 
and 
  AreaId is null 
and 
 not exists(select PostCodeOutCode From Area where PostCodeOutCode=@PostCodeOutcode)
4 голосов
/ 16 августа 2011

Существует различие для левого объединения между этими двумя:

Select *
From Table1 t1
Left Outer Join Table2 t2 On t2.id = t1.id
Where t2.somevalue = @SomeParameter

И

Select *
From dbo.Table1 t1
Left Outer Join dbo.Table2 t2 On t2.id = t1.id And t2.somevalue = @SomeParameter

Последний будет фильтровать таблицу 2, тогда как первый будет фильтровать соединение между таблицей 1 и таблицей 2,Таким образом, это означает, что первый запрос объединит все строки в двух таблицах по id, а затем отфильтрует те, где somevalue не соответствует параметру, то есть, как правило, это также отфильтрует те, в которых somevalue равно null, потому что не былоrow.

Второй запрос объединит table1 с table2 по id, но table2 сначала фильтруется по соответствующему параметру, поэтому несоответствующие строки также возвращаются и, следовательно, не отфильтровываются.

И примечание: вы всегда должны указывать схему ваших таблиц в запросах (из соображений производительности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...