оракул - полное внешнее объединение sql для трех операторов select - PullRequest
0 голосов
/ 04 ноября 2011

Я хочу выбрать значения из трех таблиц.У каждой таблицы есть столбец customer_entity_id.

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

Вот оператор для соединения двух таблиц, который работает именно так, как я хочу, чтобы он работал:

select * from (select  b.buyer_entity_id, count(distinct(a.row_id)) as imps 
from imps a, anl_line b
where b.line_item_id=a.buyer_line_id 
and a.entity_id=3
group by b.buyer_entity_id
order by b.buyer_entity_id) tab1
full outer join (select b.buyer_entity_id, count(distinct(a.row_id)) as clicks 
from clicks a, anl_line b 
where a.buyer_line_id=b.line_item_id 
and a.entity_id=3
group by b.buyer_entity_id 
order by b.buyer_entity_id) tab2
on tab1.buyer_entity_id = tab2.buyer_entity_id;

Третья таблица будет иметь идентичный оператор выбора и будет также присоединена к customer_entity_idценность также.Тем не менее, когда я добавляю третий оператор выбора, я получаю сообщение об ошибке «отсутствует ключевое слово».Ниже мое трехстороннее полное заявление о внешнем соединении:

select * from ((select  b.buyer_entity_id, count(distinct(a.row_id)) as imps 
from imps_table a, line_table b
where b.line_item_id=a.buyer_line_id 
and a.entity_id=3
group by b.buyer_entity_id
order by b.buyer_entity_id) tab1
full outer join (select b.buyer_entity_id, count(distinct(a.row_id)) as clicks 
from clicks_table a, line_table b 
where a.buyer_line_id=b.line_item_id 
and a.entity_id=3
group by b.buyer_entity_id 
order by b.buyer_entity_id) tab2)
outer join (select  b.buyer_entity_id, count(distinct(a.row_id)) as vers 
from vers_table a, line_table b
where b.line_item_id=a.buyer_line_id 
and a.entity_id=3
group by b.buyer_entity_id
order by  b.buyer_entity_id) tab3
on tab1.buyer_entity_id = tab2.buyer_entity_id and tab2.buyer_entity_id=tab3.buyer_entity_id;

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Ошибка здесь: order by b.buyer_entity_id) tab2).Вам нужно предложение on, чтобы указать условие соединения между tab1 и tab2.order by b.buyer_entity) tab1 on <join condition)

Как только это будет исправлено.Вам нужно будет добавить full к следующей строке, чтобы outer join (select b.buyer_entity_id, count(distinct(a.row_id)) as vers стало full outer join (select b.buyer_entity_id, count(distinct(a.row_id)) as vers.

Это охватывает синтаксические проблемы, но не семантические проблемы.

Соединения по парам Таблица 1 соединяется с таблицей 2 при некоторых условиях, после чего результаты переходят в левую часть следующего соединения.Что вы хотите, чтобы произошло, если tab1 и tab3 совпадают, а tab2 нет?Я предположил бы создать строку с данными tab1 и tab3 и нулями tab2.Что-то вроде:

select * 
from (select  b.buyer_entity_id, count(distinct(a.row_id)) as imps 
        from imps_table a, line_table b
        where b.line_item_id=a.buyer_line_id 
        and a.entity_id=3
        group by b.buyer_entity_id) tab1
full outer join (select b.buyer_entity_id, count(distinct(a.row_id)) as clicks 
        from clicks_table a, line_table b 
        where a.buyer_line_id=b.line_item_id 
        and a.entity_id=3
        group by b.buyer_entity_id) tab2
    on tab1.buyer_entity_id = tab2.buyer_entity_id
full outer join (select  b.buyer_entity_id, count(distinct(a.row_id)) as vers 
        from vers_table a, line_table b
        where b.line_item_id=a.buyer_line_id 
        and a.entity_id=3
        group by b.buyer_entity_id) tab3
    on tab3.buyer_entity_id in (tab1.buyer_entity_id, tab2.buyer_entity_id)
order by coalesce(tab1.buyer_entity_id
    , tab2.buyer_entity_id
    , tab3.buyer_entity_id);

Также, пожалуйста, потеряйте order by в подзапросах.Они ничего не делают для вас, так как орден не гарантированно выживет при соединениях.

1 голос
/ 17 июня 2013

Более быстрый метод будет таким, как указано здесь https://forums.oracle.com/thread/2388229

SELECT       COALESCE (a.id, b.id, c.id)     AS common_id
,       NVL2 (a.id, 1, NULL)           AS table_a_flag
,       NVL2 (b.id, 1, NULL)           AS table_b_flag
,       NVL2 (c.id, 1, NULL)           AS table_c_flag
FROM              table_a  a
FULL OUTER JOIN  table_b  b  ON  b.id  =           a.id
FULL OUTER JOIN      table_c  c  ON  c.id  = COALESCE (a.id, b.id)
ORDER BY  common_id;
1 голос
/ 04 ноября 2011

Вы можете немного упростить использование предложения WITH:

С first_part as ((выберите ....) внешнее соединение (выберите ....));select * from first_part external join (select ....);

Вы можете пересмотреть общую логику и посмотреть, есть ли лучший способ выполнить то, что вы пытаетесь сделать.Многочисленные внешние соединения не всегда являются наиболее эффективным решением.

...