Управление порядком соединения при объединении левого соединения и внутреннего соединения в Impala SQL

С такими данными

create table table_a as select 1 as id1;
insert into table_a values (2),(3);

create table table_b as select 1 as id1, 'a' as id2;
insert into table_b values (1,'b');

create table table_c as select 'a' as id2;

У меня есть следующий вид объединения в Impala sql:

   select *
     from table_a as a
left join table_b as b
       on b.id1 = a.id1
left join table_c as c
       on c.id2 = b.id2

дающий этот результат

"id1","id1","id2","id2"
1,1,b,
1,1,a,a
2,,,
3,,,

Я бы хотел, чтобы второе соединение было внутренним, а не левым:

   select *
     from table_a as a
left join table_b as b
       on b.id1 = a.id1
     join table_c as c   /* <- How to process this join first without using inner queries? */
       on c.id2 = b.id2

и получить этот результат:

"id1","id1","id2","id2"
1,1,a,a
2,,,
3,,,

Таким образом, я хотел бы, чтобы внутреннее соединение table_b а также table_c иметь место сначала и только после того, как сделать левое соединение между table_a а также (table_b внутренний присоединился к table_b).

Можно ли таким способом определить порядок соединения без использования внутренних запросов?

1 ответ

С помощью @jarlh я реализовал обработку объединений слева направо, а затем обнаружил, что можно использовать ПРАВЫЕ объединения:

    select *
      from table_c as c
      join table_b as b
        on b.id2 = c.id2
right join table_a as a
        on a.id1 = b.id1;

чтобы получить желаемый результат:

"id2","id1","id2","id1"
a,1,a,1
,,,2
,,,3
Другие вопросы по тегам