Left Outer join и дополнительное условие where - PullRequest
27 голосов
/ 09 сентября 2010

У меня есть объединение двух таблиц, определенное как левое внешнее объединение, так что все записи возвращаются из левой таблицы, даже если у них нет записи в правой таблице.Однако мне также нужно включить выражение where в поле из правой таблицы, но .... Я все еще хочу, чтобы строка из левой таблицы возвращалась для каждой записи в левой таблице, даже еслиусловие в предложении where не выполнено.Есть ли способ сделать это?

Ответы [ 5 ]

20 голосов
/ 09 сентября 2010

Да, поместите условие (называемое предикатом) в условия соединения

   Select [stuff]
   From TableA a
       Left Join TableB b
           On b.Pk = a.Pk
               -- [Put your condition here, like this]
               And b.Column = somevalue
10 голосов
/ 09 сентября 2010

Вам просто нужно поместить предикат в условие JOIN. Если поместить его в предложение WHERE, ваш запрос будет преобразован во внутреннее соединение.

Например:

...
From a
Left Join b on a.id = b.id and b.condition = 'x'
2 голосов
/ 09 сентября 2010

Вы можете использовать

WHERE (right_table.column=value OR right_table.column IS NULL)

Это вернет все строки из таблицы 1 и таблицы 2, но только там, где в таблице 1 нет соответствующей строки в таблице 2 или соответствующая строка в таблице 2 соответствует вашейкритерии.

1 голос
/ 09 сентября 2010
SELECT x.fieldA, y.fieldB
FROM x
LEFT OUTER JOIN (select fieldb, fieldc from Y where condition = some_condition)
ON x.fieldc = y.fieldc
0 голосов
/ 09 сентября 2010
select * 
  from table1 t1 
  left outer join table2 t2 on t1.id = t2.id
 where t1.some_field = nvl(t2.some_field, t1.some_field) 

UPD: ошибка ... нет. таким образом:

select * 
  from table1 t1 
  left outer join table2 t2 on t1.id = t2.id
 where some_required_value = nvl(t2.some_field, some_required_value) 

nvl - это синтаксис Oracle, который заменяет первый аргумент вторым, если он равен null (что является общим для внешних объединений). Вы можете использовать ifnull или coalesce для других баз данных.

Таким образом, вы сравниваете t2.some_field с критериями поиска, если он соответствует предикату соединения, но если нет, то вы просто возвращаете строку из table1, поскольку some_required_value по сравнению с самим собой всегда будет истинным (если только это null, однако - null = null дает null, ни true не false.

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