powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / exists и order by
20 сообщений из 45, страница 2 из 2
exists и order by
    #39827600
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo
Код: plsql
1.
(t.id,1,'Y') in (select id, row_number()

Вот и дословно
Elicагрегировать аналитикой.
...
Рейтинг: 0 / 0
exists и order by
    #39827602
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна
Код: plsql
1.
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

Но тут и LATERAL с APPLY недоступны, конечно же...
Ага, конечно...
http://www.fors.ru/upload/magazine/07/http_text/russia_s.malakshinov_distinct_top.html
...
Рейтинг: 0 / 0
exists и order by
    #39827605
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousАга, конечно...речь "за конфетки из пакетика", без "танцев с бубнами"...
...
Рейтинг: 0 / 0
exists и order by
    #39827607
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

так-то "при помощи лома и чей-то матери" и не такого наворотить можно. Вы бы хотели на продакте видеть такой код в эвентами? как по мне - то ну его куда подальше.
...
Рейтинг: 0 / 0
exists и order by
    #39827610
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаandrey_anonymous,

так-то "при помощи лома и чей-то матери" и не такого наворотить можно. Вы бы хотели на продакте видеть такой код в эвентами? как по мне - то ну его куда подальше.

какой конкретнее код на продакте Вам не нравится?

....
stax
...
Рейтинг: 0 / 0
exists и order by
    #39827611
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

ответ Андрею, на его предложение юзать LATERAL на древних версиях, череp установку эвента 22829
...
Рейтинг: 0 / 0
exists и order by
    #39827614
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаStax,

ответ Андрею, на его предложение юзать LATERAL на древних версиях, череp установку эвента 22829

спасибо (я не понял про эвент 22829)

.....
stax
...
Рейтинг: 0 / 0
exists и order by
    #39827615
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаStax,

ответ Андрею, на его предложение юзать LATERAL на древних версиях, череp установку эвента 22829
1. Чтите внимательнее. Там не только 22829.
2. Продуктовый сервер на 11.2.0.2 по состоянию на сегодня - не тот случай, когда следует быть особо разборчивым. Система либо просится под замену, либо на этот конкретный под всем плевать через губу.
...
Рейтинг: 0 / 0
exists и order by
    #39827621
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous1. Чтите внимательнее. Там не только 22829.
2. Продуктовый сервер на 11.2.0.2 по состоянию на сегодня - не тот случай, когда следует быть особо разборчивым. Система либо просится под замену, либо на этот конкретный под всем плевать через губу.
1) На досуге - обязательно ознакомлюсь.
2) Это "игрушка" для демонстрации/проверки ответов на sql.ru. В реальной жизни Oracle остался далеко за рамками моего профессионального горизонта... ;)
...
Рейтинг: 0 / 0
exists и order by
    #39827630
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннану или куда Elic клонит - агрегитрованный скалярный коррелированный подзапрос
Мне кажется, Elic клонит в эту сторону - если я не прав, пусть он первый бросит в меня камень!
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select t1.*
from tab1 t1
where t1.id in
  (select t2.id
   from tab2 t2   
   group by t2.id
   having max(t2.condition) keep (dense_rank last order by t2.dat) = 'Y'
  );


Хотя мне на dual-ах не нравится exists-шаг в плане (реальные таблицы подкладывать лень):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Plan hash value: 2962121666
 
-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     7 |    21   (5)| 00:00:01 |
|*  1 |  FILTER          |      |       |       |            |          |
|   2 |   VIEW           |      |     2 |    14 |     4   (0)| 00:00:01 |
|   3 |    UNION-ALL     |      |       |       |            |          |
|   4 |     FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|   5 |     FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|*  6 |   FILTER         |      |       |       |            |          |
|   7 |    SORT GROUP BY |      |     8 |   120 |    17   (6)| 00:00:01 |
|   8 |     VIEW         |      |     8 |   120 |    16   (0)| 00:00:01 |
|   9 |      UNION-ALL   |      |       |       |            |          |
|  10 |       FAST DUAL  |      |     1 |       |     2   (0)| 00:00:01 |
|  11 |       FAST DUAL  |      |     1 |       |     2   (0)| 00:00:01 |
|  12 |       FAST DUAL  |      |     1 |       |     2   (0)| 00:00:01 |
|  13 |       FAST DUAL  |      |     1 |       |     2   (0)| 00:00:01 |
|  14 |       FAST DUAL  |      |     1 |       |     2   (0)| 00:00:01 |
|  15 |       FAST DUAL  |      |     1 |       |     2   (0)| 00:00:01 |
|  16 |       FAST DUAL  |      |     1 |       |     2   (0)| 00:00:01 |
|  17 |       FAST DUAL  |      |     1 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter( EXISTS (SELECT 0 FROM  ( (SELECT 1 "ID",SYSDATE@! 
              "DAT",'Y' "CONDITION" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2 
              "ID",SYSDATE@!-1 "DAT",'Y' "CONDITION" FROM "SYS"."DUAL" "DUAL") UNION 
              ALL  (SELECT 2 "ID",SYSDATE@!-2 "DAT",'Y' "CONDITION" FROM "SYS"."DUAL" 
              "DUAL") UNION ALL  (SELECT 2 "ID",SYSDATE@!-3 "DAT",'N' "CONDITION" 
              FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2 "ID",SYSDATE@!-4 
              "DAT",'Y' "CONDITION" FROM "SYS"."DUAL" "DUAL") UNION ALL  (SELECT 2 
              "ID",SYSDATE@!-5 "DAT",'N' "CONDITION" FROM "SYS"."DUAL" "DUAL") UNION 
              ALL  (SELECT 2 "ID",SYSDATE@!-6 "DAT",'Y' "CONDITION" FROM "SYS"."DUAL" 
              "DUAL") UNION ALL  (SELECT 2 "ID",SYSDATE@! "DAT",'N' "CONDITION" FROM 
              "SYS"."DUAL" "DUAL")) "T2" GROUP BY "T2"."ID" HAVING "T2"."ID"=:B1 AND 
              MAX("T2"."CONDITION") KEEP (DENSE_RANK FIRST  ORDER BY 
              INTERNAL_FUNCTION("T2"."DAT") DESC )='Y'))
   6 - filter("T2"."ID"=:B1 AND MAX("T2"."CONDITION") KEEP (DENSE_RANK 
              FIRST  ORDER BY INTERNAL_FUNCTION("T2"."DAT") DESC )='Y')


Поэтому, если план на реальных данных будет смущать, я бы еще рассмотрел предложенный вариант:
Щукина АннаJOIN же на предагрегированный по ID inline-view на базе tab2
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
select t1.*
from tab1 t1
right join
  (select t2.id
   from tab2 t2   
   group by t2.id
   having max(t2.condition) keep (dense_rank last order by t2.dat) = 'Y'
  ) t2 on t1.id = t2.id;

Plan hash value: 4107750370
 
-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     8 |    80 |    21   (5)| 00:00:01 |
|*  1 |  HASH JOIN OUTER |      |     8 |    80 |    21   (5)| 00:00:01 |
|   2 |   VIEW           |      |     8 |    24 |    17   (6)| 00:00:01 |
|*  3 |    FILTER        |      |       |       |            |          |
|   4 |     SORT GROUP BY|      |     8 |   120 |    17   (6)| 00:00:01 |
|   5 |      VIEW        |      |     8 |   120 |    16   (0)| 00:00:01 |
|   6 |       UNION-ALL  |      |       |       |            |          |
|   7 |        FAST DUAL |      |     1 |       |     2   (0)| 00:00:01 |
|   8 |        FAST DUAL |      |     1 |       |     2   (0)| 00:00:01 |
|   9 |        FAST DUAL |      |     1 |       |     2   (0)| 00:00:01 |
|  10 |        FAST DUAL |      |     1 |       |     2   (0)| 00:00:01 |
|  11 |        FAST DUAL |      |     1 |       |     2   (0)| 00:00:01 |
|  12 |        FAST DUAL |      |     1 |       |     2   (0)| 00:00:01 |
|  13 |        FAST DUAL |      |     1 |       |     2   (0)| 00:00:01 |
|  14 |        FAST DUAL |      |     1 |       |     2   (0)| 00:00:01 |
|  15 |   VIEW           |      |     2 |    14 |     4   (0)| 00:00:01 |
|  16 |    UNION-ALL     |      |       |       |            |          |
|  17 |     FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|  18 |     FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - access("T1"."ID"(+)="T2"."ID")
   3 - filter(MAX("T2"."CONDITION") KEEP (DENSE_RANK FIRST  ORDER BY 
              INTERNAL_FUNCTION("T2"."DAT") DESC )='Y')
...
Рейтинг: 0 / 0
exists и order by
    #39827635
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

если посмотреть внимательно на расстановку скобочек и момент применения условия = Y, то нет - неправильно вам кажется...
...
Рейтинг: 0 / 0
exists и order by
    #39827638
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

но право кидать камень, конечно же, остается за Elic-ом
...
Рейтинг: 0 / 0
exists и order by
    #39827639
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadЩукина Аннану или куда Elic клонит - агрегитрованный скалярный коррелированный подзапросАнна меня правильно поняла.
...
Рейтинг: 0 / 0
exists и order by
    #39827644
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Медленно, еле-еле выползаю из под камней
...
Рейтинг: 0 / 0
exists и order by
    #39827665
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
Мне кажется, Elic клонит в эту сторону - если я не прав, пусть он первый бросит в меня камень!


надо у grinn уточнить условие

если судить по его селекту (считать селект правильным ), то я неверно понял задачу,
и мое решение 21910289 ошибочно


зы
не люблю джоин, мне exists более понятен (хотя допускаю, что exists может быть менее ефективным)

....
stax
...
Рейтинг: 0 / 0
exists и order by
    #39827666
grinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxнужны дополнительные разъяснения автора

Прошу прощения, не совсем точно сформулировал задачу.
Если в tab2 самая свежая запись имеет tab2.condition = 'Y', то запись из tab1 попадает в набор, иначе - нет.
Сделал так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT *
FROM   tab1
	  ,tab2
WHERE  tab1.id = tab2.id
	   AND tab2.condition = 'Y'
	   AND NOT EXISTS (SELECT 1
		FROM   tab2 t_2
		WHERE  t_2.id = tab2.id
			   AND t_2.date > tab2.date)


Всем большое спасибо!
...
Рейтинг: 0 / 0
exists и order by
    #39827676
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grinnStaxнужны дополнительные разъяснения автора

Прошу прощения, не совсем точно сформулировал задачу.
Если в tab2 самая свежая запись имеет tab2.condition = 'Y', то запись из tab1 попадает в набор, иначе - нет.
Сделал так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT *
FROM   tab1
	  ,tab2
WHERE  tab1.id = tab2.id
	   AND tab2.condition = 'Y'
	   AND NOT EXISTS (SELECT 1
		FROM   tab2 t_2
		WHERE  t_2.id = tab2.id
			   AND t_2.date > tab2.date)


Всем большое спасибо!давно не доводилось видеть старообрядного синтаксиса джойнов...
...
Рейтинг: 0 / 0
exists и order by
    #39827677
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grinnЕсли в tab2 самая свежая запись имеет tab2.condition = 'Y', то запись из tab1 попадает в набор, иначе - нет.

Всем большое спасибо!

оооо, именно так я и понял задачку

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT *
FROM   tab1
WHERE  EXISTS (SELECT 1
		FROM   (SELECT *
				FROM   tab2
				WHERE  tab2.id = tab1.id
				ORDER  BY tab2.date DESC) s1
		WHERE  ROWNUM = 1
			   AND s1.condition = 'Y');


неверен

.....
stax
...
Рейтинг: 0 / 0
exists и order by
    #39827687
grinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
Код: plsql
1.
2.
		WHERE  ROWNUM = 1
			   AND s1.condition = 'Y');


неверен

Вы имеете в виду, что сначала выполнится условие s1.condition = 'Y', а уже затем ROWNUM = 1?
Да, тогда запрос неверен. Спасибо, что акцентировали.
...
Рейтинг: 0 / 0
exists и order by
    #39827699
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grinnВы имеете в виду, что сначала выполнится условие s1.condition = 'Y', а уже затем ROWNUM = 1?
Да, тогда запрос неверен. Спасибо, что акцентировали.

да
надо еще одін уровень вложенности
в новых версиях отработает

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


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