2013-11-21 5 views
0

Я запускаю левое внешнее соединение на двух таблицах, но полученные результаты не так ожидаются. Я привел приведенные ниже примеры:Oracle не работает как ожидалось

Когда я запускаю условие на отдельные tavles, ниже приведены значения.

select count(*) from TableA 
where ColumnA= 'X' 
and ColumnB like 'ABC' 

--Count 10000 

select count(*) from TableB 
where ColumnD in ('hello','there') 

--Count 7350 

select count(*) from TableA ta 
LEFT JOIN TableB tb 
on ta.ColumnM = tb.ColumnN 
where ta.ColumnA= 'X' 
and ta.ColumnB like 'ABC' 
and tb.ColumnD in ('hello','there') 

Expected Count - 10000 
Actual Count - 7300 

Я предполагаю, что мое понимание соединений неверно в этом случае. может ли кто-нибудь объяснить поведение и сообщить мне, где я ошибаюсь?

ответ

3

Причина, по которой вы ожидаете возвращения 10k строк, состоит в том, что левое соединение должно создавать строку для всех, кто находится в первой таблице. Когда он не находит строку, он создает нуль, который вы сбросив с этим пунктом:

and tb.ColumnD in ('hello','there') 

Если вы хотите 10k строк, применять, где положение на столе б до Жуэна, а не после того, как :

select count(*) from TableA ta 
LEFT JOIN (select * from TableB tb.ColumnD in ('hello','there')) tb 
on ta.ColumnM = tb.ColumnN 
where ta.ColumnA= 'X' 
and ta.ColumnB like 'ABC' 

Редактировать ... это лучше работает, спасибо за комментарий:

select count(*) from TableA ta 
LEFT JOIN TableB tb 
on ta.ColumnM = tb.ColumnN and tb.ColumnD in ('hello','there') 
where ta.ColumnA= 'X' 
and ta.ColumnB like 'ABC' 
+1

Хорошее объяснение, но вид рядный не нужно. 'left join tableb tb на ta.ColumnM = tb.ColumnN и tb.ColumnD in ('hello', 'there')' будет работать нормально –

4

Ваше where условие на внешней присоединяемой таблицы (tb.ColumnD in ('hello','there')) превращает внешнее соединение ба ck во внутреннее соединение.

Вы должны применить это условие в предложении присоединиться:

select count(*) 
from TableA ta 
    LEFT JOIN TableB tb 
     on ta.ColumnM = tb.ColumnN 
     and tb.ColumnD in ('hello','there') 
where ta.ColumnA= 'X' 
    and ta.ColumnB like 'ABC' 
Смежные вопросы