Подтвердить что ты не робот

Левое внешнее соединение и дополнительное предложение where

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

4b9b3361

Ответ 1

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

   Select [stuff]
   From TableA a
       Left Join TableB b
           On b.Pk = a.Pk
               -- [Put your condition here, like this]
               And b.Column = somevalue

Ответ 2

Вам просто нужно поставить предикат в условие JOIN. Включение в предложение WHERE эффективно преобразует ваш запрос в внутреннее соединение.

Пример:

...
From a
Left Join b on a.id = b.id and b.condition = 'x'

Ответ 3

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

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

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

Ответ 4

SELECT x.fieldA, y.fieldB
FROM x
LEFT OUTER JOIN (select fieldb, fieldc from Y where condition = some_condition)
ON x.fieldc = y.fieldc

Ответ 5

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: errr... no. следующим образом:

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 not false.