2013-07-03 2 views
0

У меня есть простой сценарий, но изо всех сил на него:Возвращаемое значение, если запись не существует на присоединиться, оракул

Скажем, у меня есть следующие 2 таблицы:

tableA 
Acol1 Acol2 Acol3  
1  2  3 

tableB 
Bcol1 Bcol2 Bcol3 
1  2 true 

Запрос:

select tabB.Bcol3 from tableA tabA, tableB tabB 
where 
tabA.Acol1 = tabB.Bcol1 
and tabB.Bcol2 = 1 
and tabA.Acol1 = 1; 

Я хочу, чтобы мой запрос возвращал значение «false», поскольку для этого запроса не существует записи.

P.S: Я не могу использовать агрегированные функции, потому что на самом деле этот сценарий является частью более крупного запроса с примерно 15 соединениями и несколькими столбцами.

Так следующее решение из контекста:

select decode(max(tabB.Bcol3), null, 'FALSE', 'TRUE') from tableA tabA, tableB tabB 
    where 
    tabA.Acol1 = tabB.Bcol1 
    and tabB.Bcol2 = 1 
    and tabA.Acol1 = 1; 

я попытался левый и правый внешние соединения, но тщетно.

ответ

0

Используйте LEFT JOIN с COALESCE():

select coalesce(tabB.Bcol3, false) 
from tableA tabA 
left join tableB tabB on tabA.Acol1 = tabB.Bcol2 
    and tabB.Bcol2 = 1 
where tabA.Acol1 = 1; 

COALESCE() возвращает первое ненулевое значение. Когда соединение не находит совпадение, столбцы tableB будут нулевыми - это значит, что будет возвращено значение по умолчанию false.

Кажется малоизвестным фактом, что условия соединения могут включать в себя неключевые условия. Включив дополнительное условие на tabkeB в состоянии соединения, левое соединение по-прежнему эффективно при возврате строки для tableA. Если оставить в предложении where, никакая строка не будет возвращена, следует использовать предложение where, указанное в списке после, соединение выполнено и потерпит неудачу, потому что нуль не будет равняться 1.

+0

Thx, но я просто переработал маленькая ошибка. В моем вопросе соединение является достаточно успешным, но запись не существует в фильтре (где предложение). i.e. Соединение похоже на: tabA.Acol1 = tabB.Bcol1 – user1933888

+0

К сожалению. Я починил это. Просто переместите условие на rableb из htte ckause в предложение join. Попробуй это сейчас. – Bohemian

+0

Thx: он работает хорошо (не уверен, почему я не пробовал) :) Я по своей сути предпочитаю оператор (+) представлению ansi, запрос выглядит более чистым таким образом (особенно более крупные). Я знаю, что люди будут на меня нахмуриться, говоря это. Тем не менее Следующий запрос будет эквивалентом вышеуказанного запроса вы дали право ?: выберите COALESCE (tabB.Bcol3, ложь) от TABLEA Табе, TableB TABB где tabA.Acol1 = tabB.Bcol2 (+) и TABB .Bcol2 (+) = 1 и tabA.Acol1 = 1; – user1933888

Смежные вопросы