Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переписать запрос / 2 сообщений из 2, страница 1 из 1
18.10.2017, 00:21
    #39537755
PartitionOuterJoin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать запрос
Вроде как красиво через partition join делалось, но не вспомню как.
Есть два набора.
Надо из первого набора вывести все записи, если во втором наборе нет данных
или сджойнить его по id со вторым набором, если во втором есть данные.
...
Рейтинг: 0 / 0
18.10.2017, 02:34
    #39537770
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать запрос
PartitionOuterJoinВроде как красиво через partition join делалось, но не вспомню как.
Есть два набора.
Надо из первого набора вывести все записи, если во втором наборе нет данных
или сджойнить его по id со вторым набором, если во втором есть данные.Соединяя так или иначе надо знать сколько строк в t2.

Цель сделать красиво меньше букв или эффективно?

Если первое - можно играться с латералами. Первый случай merge join, второй - NL.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select t1.*
  from t1, lateral (select t2.*, count(*) over() cnt from t2 /*where 1 = 0*/)(+) t2
 where cnt is null or t1.id = t2.id;

select t1.*
  from (select t2.*, count(t2.rowid) over() cnt
          from dual, lateral (select * from t2 /*where 1 = 0*/)(+) t2) t2,
       t1
 where cnt = 0
    or t2.id = t1.id;



Если второе - union all. Будет HJ или full scan в зависимости от.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select t1.*
  from t1, t2
 where t2.id = t1.id
   and 1 = (select count(*) from t2 where rownum = 1)
union all
select t1.*
  from t1
 where 0 = (select count(*) from t2 where rownum = 1);
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переписать запрос / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]