powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите написать запрос
3 сообщений из 3, страница 1 из 1
Помогите написать запрос
    #39540666
avmfree
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть следующая БД:

U72 - таблица событий
поля:
U72TUID - уникальный цифровой идентификатор события
U72LCDT - время события

L43 - Таблица операций
поля:
L43LCDT - время операции


Нужно чтобы для каждого события U72TUID из L43 выбиралось 20 ПОСЛЕДНИХ (order by L43LCDT desc)
операций предшествующих по дате событию (т.е. L43LCDT<=U72LCDT)

Отдельно следующий подзапрос отрабатывает и выдает для события 26123 нужные записи
Select U72LCDT,L43LCDT from L43,U72
where L43LCDT<=U72LCDT and rownum<20 and U72TUID= 26123
order by L43LCDT desc

Однако собрать запрос для всех записей U72 никак не получается.

Хочется что-то типа

select U72TUID,U72LCDT,L43LCDT from U72 extU72,
(Select U72LCDT,L43LCDT from L43,U72
where L43LCDT<=U72LCDT and rownum<20 and U72TUID=extU72.U72TUID
order by L43LCDT desc)

однако Oracle выдает ошибку

ORA-00904: "EXTU72"."U72TUID": недопустимый идентификатор
00904. 00000 - "%s: invalid identifier"

Подскажите, пожалуйста, как быть. Буду очень благодарен.
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39540677
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avmfreeselect U72TUID,U72LCDT,L43LCDT from U72 extU72,
(Select U72LCDT,L43LCDT from L43,U72
where L43LCDT<=U72LCDT and rownum<20 and U72TUID=extU72.U72TUID
order by L43LCDT desc)

однако Oracle выдает ошибкуRTFM LATERAL (FAQ)
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39540856
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avmfreeОтдельно следующий подзапрос отрабатывает и выдает для события 26123 нужные записи
Select U72LCDT,L43LCDT from L43,U72
where L43LCDT<=U72LCDT and rownum<20 and U72TUID= 26123
order by L43LCDT desc



повезло
в общем случае Вы получите случайные 19 записей (не последних),
rownum определяется до сортировки

надо заворачивать в подзапрос

Код: plsql
1.
2.
3.
4.
5.
select * from (
 Select U72LCDT,L43LCDT from L43,U72
 where L43LCDT<=U72LCDT and U72TUID= 26123 
 order by L43LCDT desc
) where rownum<20



если версия древняя (нет латерал, топ n), то для выборки "всех" надо соеденить таблички

для каждого отдела выбрать три самых "молодых" сотрудника
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
  1  select * from (
  2    select dname,empno,hiredate
  3           ,row_number() over (partition by e.deptno order by hiredate desc,empno) rn
  4    from dept d,emp e
  5    where d.deptno=e.deptno(+)
  6  ) where rn<=3
  7* order by dname,rn
SQL> /

DNAME               EMPNO HIREDATE         RN
-------------- ---------- -------- ----------
ACCOUNTING           7934 23.01.82          1
ACCOUNTING           7839 17.11.81          2
ACCOUNTING           7782 09.06.81          3
OPERATIONS                                  1
RESEARCH             7876 12.01.83          1
RESEARCH             7788 09.12.82          2
RESEARCH             7902 03.12.81          3
SALES                7900 03.12.81          1
SALES                7654 28.09.81          2
SALES                7844 08.09.81          3

10 rows selected.



......
stax
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите написать запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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