2014-02-06 3 views
0

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

В сценарии, где есть соотношение 1: 1 между левой и правой таблицей, я бы предположил, что счетчик операции соединения будет точно равен счету в левой таблице.

Я заметил, что это верно для MS SQL, но Oracle (PL/SQL), похоже, имеет другую интерпретацию этого. Количество левого внешнего соединения в Oracle - это сумма всех записей в левой таблице + соответствующие записи справа.

Просьба подтвердить, насколько я прав в своем понимании и что является лучшим методом, чтобы мы могли согласовать данные между Oracle и MS SQL.

Код -

select distinct NVL(L11, NVL(L10, NVL(L9, NVL(L8, NVL(L7, NVL(L6, NVL(L5, NVL(L4, NVL(L3, NVL(L2, NVL(L1,  NVL(L0,'ERR')))))))))))) ENDITEM, case when l1 = 'Raw Wafer' then l0 
when l2 = 'ABC' then l1 
when l3 = 'ABC' then l2 
when l4 = 'ABC' then l3 
when l5 = 'ABC' then l4 
when l6 = 'ABC' then l5 
when l7 = 'ABC' then l6 
when l8 = 'ABC' then l7 
when l9 = 'ABC' then l8 
when l10 = 'ABC' then l9 
when l11 = 'ABC' then l10 end item, g1.item bl1, g2.item bl2, g3.item bl3, g4.item bl4, g5.item bl5, g6.item  bl6, g7.item bl7, g8.item bl8, g9.item bl9, g10.item bl10, g11.item bl11, 
decode(g1.item, null, 0, 1) + decode(g2.item, null, 0, 1) + decode(g3.item, null, 0, 1) + decode(g4.item,  null, 0, 1) + decode(g5.item, null, 0, 1) + decode(g6.item, null, 0, 1) + decode(g7.item, null, 0, 1) + decode(g8.item, null, 0, 1) + decode(g9.item, null, 0, 1) + decode(g10.item, null, 0, 1) + decode(g11.item, null, 0, 1) cnt, 
gg.* from TABL1 gg 
left outer join TABL2 g1 on g1.item = gg.l1 
left outer join TABL2 g2 on g2.item = gg.l2 
left outer join TABL2 g3 on g3.item = gg.l3   
left outer join TABL2 g4 on g4.item = gg.l4   
left outer join TABL2 g5 on g5.item = gg.l5   
left outer join TABL2 g6 on g6.item = gg.l6 
left outer join TABL2 g7 on g7.item = gg.l7 
left outer join TABL2 g8 on g8.item = gg.l8 
left outer join TABL2 g9 on g9.item = gg.l9 
left outer join TABL2 g10 on g10.item = gg.l10 
left outer join TABL2 g11 on g11.item = gg.l11 

когда я счетчик на этом MS SQL предлагает только счет от TABL1 в то время как Oracle, кажется, предлагает более.

Спасибо.

+1

Оракул должен вести себя одинаково - я подозреваю, что ваше условие соединения или синтаксис неверны. –

+1

Левое внешнее соединение определено стандартным способом для всех баз данных. Отправьте код Oracle; он не делает то, что, по вашему мнению, делает. –

+0

Согласен с вышеприведенными комментариями, это проблема кодирования. – Namphibian

ответ

1

Возможно, это слишком длинный комментарий.

Во-первых, если вы сравниваете запросы в разных базах данных, почему вы показываете код, который работает только в одном из них? Этот запрос можно написать стандартным способом через базы данных, довольно просто, используя case и coalesce().

Не видя результатов, я могу думать о двух различиях, которые могут возникнуть. Во-первых, вы используете разные запросы для разных данных в разных базах данных. Давайте проигнорируем это, потому что есть еще одна возможность.

Oracle рассматривает NULL строковые значения и пустые строки как то же самое. Это имеет всевозможные последствия, особенно при использовании NVL() (или выполнения агрегации и получения одной строки вместо двух). Я предполагаю, что эта нестандартная «особенность» Oracle вызывает разные результаты.

Вы можете по-разному формулировать запрос, чтобы получить тот же результат во всех базах данных, используя случай. Заменить nvl(val1, val2) на:

(case when val1 is null or val1 = '' then val2 else val1 end) 
+0

спасибо. вернется. – user3277704

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