2016-08-08 4 views
0

Я пытаюсь отобразить 3 таблицы в базе данных Oracle:Oracle SQL Outer Left Join не возвращает строки

testHdr, testDet, testOther 

testHdr является заголовок таблицы, testDet это таблица подробно, и testOther просто дополнительная таблица, в которой я нужно получить несколько столбцов.

Возможно, что есть данные в testHdr, но не в testDet. Я хочу показать пустое/нулевое значение из testDet, если нет значения.

Ключ к карте testHdr к testDet является adj_no и adj_no2

SELECT hdr.*, det.*, othr.* 
FROM testHdr hdr, testDet det, testOther othr 
where hdr.adj_no = det.adj_no (+) 
and hdr.adj_no2 = det.adj_no2 (+) 
and i.key3 = det.key3 
and hdr.adj_no = '112' 

* 112 только заголовок записи, но не подробно запись

  • Я желаю, чтобы получить данные для hdr.adj_no = 112, если есть данные заголовка, такие как 113, 114 и т. д., он не будет отображаться в результате запроса.

Я попытался выше запрос с внешней LeftJoin, но он показывает:

ORA-01416: two tables cannot be outer-joined to each other 
+0

Переместить условие adj_no где слева условие соединения –

+0

@AbhilashRVankayala вы имеете в виду 'где hdr.adj_no (+) = det.adj_no и hdr.adj_no2 = det.adj_no2 (+)'? – hades

+0

Нет, я предложил, как Тим отправил в ответ. –

ответ

2

Вы должны использовать явное левое соединение:

SELECT hdr.*, det.*, othr.* 
FROM testHdr hdr 
LEFT JOIN testDet det 
    ON hdr.adj_no = det.adj_no AND 
     hdr.adj_no2 = det.adj_no2 
LEFT JOIN testOther othr 
-- ON <some condition> 
WHERE i.key3 = det.key3 AND 
     hdr.adj_no = '112' 

В исходном запросе вы никогда не указан какой-либо условий соединения для таблицы testOther, что означает, что вы выполняете кросс-соединение этой таблицы. Хотя это не должно влиять на вашу фактическую проблему, если перекрестное соединение не предназначалось, вы должны добавить предложение ON, ограничивающее это соединение.

Одна из причин, почему большая часть мира базы данных отошла от синтаксиса неявного соединения, который вы использовали, именно потому, что он затрудняет просмотр того, что объединяется, а также облегчает прохождение соединения.

+0

Привет, спасибо за помощь, извините, я думаю, что я не упомянул об этом, результаты, которые я хочу получить, это hdr.adj_no = 112, значит, если в таблице заголовков 113, 114, это не вернет это значение. Я уточню свой вопрос. – hades

+0

@hades Я поддерживаю свой ответ. Если вы хотите обрабатывать отсутствующие значения, вы можете использовать 'COALESCE' в столбце, который может иметь значения« NULL ». –

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