powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / exists и order by
45 сообщений из 45, показаны все 2 страниц
exists и order by
    #39827518
grinn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем.
Задача - выбрать записи из tab1, у которых есть связанные записи в таблице tab2, но только c определенными условиям (condition = 'Y').
При этом нужно брать только последнюю запись из tab2.

Делаю так:
Код: 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');


Вроде по логике все верно. Ошибка:
ErrorНедопустимый идентификатор tab1.id
То есть, во вложенном запросе s1 не видно tab1.
Как переделать запрос, чтоб сохранить логику?
...
Рейтинг: 0 / 0
exists и order by
    #39827519
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grinn,

В общем случае - inline-view не может быть коррелированным. Если нужна корреляция, то или LATERAL, или [CROSS | OUTER] APPLY
...
Рейтинг: 0 / 0
exists и order by
    #39827521
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаЕсли нужна корреляция, то или LATERAL, или [CROSS | OUTER] APPLYА если подумать?
RTFM FIRST/LAST
...
Рейтинг: 0 / 0
exists и order by
    #39827522
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grinn,

перепишите запрос через сложенные [not]exists.
выбрать из tab1все то, для чего существует в tab2 запись со статусом 'Y' в то время, как для TAB2 не существует записи после той, что со статусом 'Y'
...
Рейтинг: 0 / 0
exists и order by
    #39827523
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicА если подумать?"А чо тут думать? Прыгать нужно!"(с) старый детский анекдот.
...
Рейтинг: 0 / 0
exists и order by
    #39827524
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна"А чо тут думать? Прыгать нужно!"(с) старый детский анекдот.Думать нужно всегда. Всё ещё жду адекватного ответа.
...
Рейтинг: 0 / 0
exists и order by
    #39827528
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаgrinn,

В общем случае - inline-view не может быть коррелированным. Если нужна корреляция, то или LATERAL, или [CROSS | OUTER] APPLY
если есть LATERAL,APPLY то версия не древняя

в новых версиях запрос отрабатывает (не слетает)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with tab1 as (
select 1 id,'Anna' n from dual)
,tab2 as (
select 1 id,sysdate dat,'Y' condition from dual)
SELECT *
FROM   tab1 
WHERE  EXISTS (SELECT 1
		FROM   (SELECT *
				FROM   tab2
				WHERE  tab2.id = tab2.id
				ORDER  BY tab2.dat DESC) s1
		WHERE  ROWNUM = 1
			   AND s1.condition = 'Y');

ID	N
1	Anna



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

не то скопипастил
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with tab1 as (
select 1 id,'Anna2' n from dual)
,tab2 as (
select 1 id,sysdate dat,'Y' condition from dual)
SELECT *
FROM   tab1 
WHERE  EXISTS (SELECT 1
		FROM   (SELECT *
				FROM   tab2
				WHERE  tab2.id = tab1.id
				ORDER  BY tab2.dat DESC) s1
		WHERE  ROWNUM = 1
			   AND s1.condition = 'Y');



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


Код: 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.
with tab1 as (
select 1 id,'Anna2' n from dual)
,tab2 as (
select 1 id,sysdate dat,'Y' condition from dual)
SELECT *
FROM   tab1 
WHERE  EXISTS (SELECT 1
		FROM   (SELECT *
				FROM   tab2
				WHERE  tab2.id = tab1.id
				ORDER  BY tab2.dat DESC) s1
		WHERE  ROWNUM = 1
			   AND s1.condition = 'Y');

ORA-00904: "TAB1"."ID": invalid identifier

select * from v$version;

BANNER
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE	11.2.0.2.0	Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

Но тут и LATERAL с APPLY недоступны, конечно же...
...
Рейтинг: 0 / 0
exists и order by
    #39827533
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grinnЗадача - выбрать записи из tab1, у которых есть связанные записи в таблице tab2, но только c определенными условиям (condition = 'Y').
При этом нужно брать только последнюю запись из tab2.


Код: plsql
1.
2.
select * from tab1 t1 join tab2 t2 on t1.id = t2.id and t2.condition = 'Y'
where not exists (select 1 from tab2 t2_e where t2_e.id = t2.id and t2_e.date < t2.date)
...
Рейтинг: 0 / 0
exists и order by
    #39827534
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаНо тут и LATERAL с APPLY недоступны, конечно же...
без латерал

для не совсем древних версий
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> ed
Wrote file afiedt.buf

  1  with tab1 as (
  2  select 1 id,'Anna' n from dual)
  3  ,tab2 as (
  4  select 1 id,sysdate dat,'Y' condition from dual)
  5  SELECT *
  6  FROM   tab1
  7  WHERE  EXISTS (
  8    SELECT 1
  9    FROM  tab2
 10    WHERE  tab2.id = tab1.id
 11    having max(condition) KEEP (DENSE_RANK last ORDER BY dat)='Y'
 12*   )
SQL> /

        ID N
---------- ----
         1 Anna



.....
stax
...
Рейтинг: 0 / 0
exists и order by
    #39827536
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedoogrinnЗадача - выбрать записи из tab1, у которых есть связанные записи в таблице tab2, но только c определенными условиям (condition = 'Y').
При этом нужно брать только последнюю запись из tab2.


Код: plsql
1.
2.
select * from tab1 t1 join tab2 t2 on t1.id = t2.id and t2.condition = 'Y'
where not exists (select 1 from tab2 t2_e where t2_e.id = t2.id and t2_e.date < t2.date)


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  1   with tab1 as (
  2   select 1 id,'Anna' n from dual union all
  3   select 2,'Jon' n from dual
  4   )
  5   ,tab2 as (
  6   select 1 id,sysdate dat,'Y' condition from dual union all
  7   select 2 id,sysdate-1 dat,'Y' condition from dual union all
  8   select 2 id,sysdate dat,'N' condition from dual )
  9  select * from tab1 t1 join tab2 t2 on t1.id = t2.id and t2.condition = 'Y'
 10* where not exists (select 1 from tab2 t2_e where t2_e.id = t2.id and t2_e.dat < t2.dat)
SQL> /

        ID N            ID DAT      C
---------- ---- ---------- -------- -
         1 Anna          1 18.06.19 Y
         2 Jon           2 17.06.19 Y


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

"c определенными условиям (condition = 'Y')" и "брать только последнюю запись из tab2" != "брать только последнюю запись из tab2 c определенными условиям (condition = 'Y')".

Но судя по селекту автора, в мой экзист стоит добавить условие по кондишену.
...
Рейтинг: 0 / 0
exists и order by
    #39827544
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo
Но судя по селекту автора, в мой экзист стоит добавить условие по кондишену.

имхо
етого мало

....
stax
...
Рейтинг: 0 / 0
exists и order by
    #39827545
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxбез латерал
Код: plsql
1.
2.
  7  WHERE  EXISTS (
 11    having max(condition) KEEP (DENSE_RANK last ORDER BY dat)='Y'

Осталось чуть-чуть - избавиться от EXISTS
...
Рейтинг: 0 / 0
exists и order by
    #39827547
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicStaxбез латерал
Код: plsql
1.
2.
  7  WHERE  EXISTS (
 11    having max(condition) KEEP (DENSE_RANK last ORDER BY dat)='Y'

Осталось чуть-чуть - избавиться от EXISTS
імхо
с EXISTS
1) красивее
2) понятние
3) если в tab1 много полей, удобнее

....
stax
...
Рейтинг: 0 / 0
exists и order by
    #39827557
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxDshedooНо судя по селекту автора, в мой экзист стоит добавить условие по кондишену.

имхо
етого мало

....
stax

И даты, конечно же, наоборот.
Утро добрым не бывает.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
   with tab1 as (
   select 1 id,'Anna' n from dual union all
   select 2,'Jon' n from dual
   )
   ,tab2 as (
   select 1 id,sysdate dat,'Y' condition from dual union all
   select 2 id,sysdate-1 dat,'Y' condition from dual union all
   select 2 id,sysdate-2 dat,'Y' condition from dual union all
   select 2 id,sysdate-3 dat,'N' condition from dual union all
   select 2 id,sysdate-4 dat,'Y' condition from dual union all         
   select 2 id,sysdate-5 dat,'N' condition from dual union all
   select 2 id,sysdate-6 dat,'Y' condition from dual union all
   select 2 id,sysdate dat,'N' condition from dual )
  select * from tab1 t1 join tab2 t2 on t1.id = t2.id and t2.condition = 'Y'
  where not exists (select 1 from tab2 t2_e where t2_e.id = t2.id and t2_e.dat > t2.dat and t2_e.condition = t2.condition)
...
Рейтинг: 0 / 0
exists и order by
    #39827569
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

Код: plsql
1.
2.
3.
4.
5.
6.
SQL> /

        ID N            ID DAT      C
---------- ---- ---------- -------- -
         1 Anna          1 18.06.19 Y
         2 Jon           2 17.06.19 Y



нужны дополнительные разяснения автора

я по другому понял постановку
для 2 (select 2 id,sysdate dat,'N') последнее состояние N, отбрасываем строку

зы
поясніть результат в
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
я не смог (туплю)

....
stax
...
Рейтинг: 0 / 0
exists и order by
    #39827571
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax1) красивееНет. Это как агрегировать аналитикой.
Stax2) понятниеНет. Вопрос "Где последнее соостояние равно?" формулируется дословно как
Код: plsql
1.
(select max(...) keep ...) = 'Y'


Stax3) если в tab1 много полей, удобнееПро expression list не слышал?
...
Рейтинг: 0 / 0
exists и order by
    #39827579
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicStax1) красивееНет. Это как агрегировать аналитикой.
Stax2) понятниеНет. Вопрос "Где последнее соостояние равно?" формулируется дословно как
Код: plsql
1.
(select max(...) keep ...) = 'Y'


Stax3) если в tab1 много полей, удобнееПро expression list не слышал?

что б о чем-то продолжать, надо увидеть решение без EXISTS

ps
Про expression list не слышал

....
stax
...
Рейтинг: 0 / 0
exists и order by
    #39827586
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxчто б о чем-то продолжать, надо увидеть решение без EXISTSJOIN же на предагрегированный по ID inline-view на базе tab2
...
Рейтинг: 0 / 0
exists и order by
    #39827589
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

ну или куда Elic клонит - агрегитрованный скалярный коррелированный подзапрос с first/last во внутрях и с проверкой во вне на равенство Y
...
Рейтинг: 0 / 0
exists и order by
    #39827590
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Вообще, учитывая то, что автор пытался в экзист, нам нужно посмотреть последнюю строку из tab2, и если она condition = 'Y', тогда вернуть из tab1.
Похоже, что автор не совсем в курсе как формируется rownum.

Скорее всего нужен либо мой первый вариант, либо что-нибудь типа:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  with tab1 as (
   select 1 id,'Anna' n from dual union all
   select 2,'Jon' n from dual union all
   select 3,'Jack' n from dual   
   )
   ,tab2 as (
   select 1 id,sysdate dat,'Y' condition from dual union all
   select 2 id,sysdate-1 dat,'Y' condition from dual union all
   select 2 id,sysdate-2 dat,'Y' condition from dual union all
   select 2 id,sysdate-3 dat,'N' condition from dual union all
   select 2 id,sysdate-4 dat,'Y' condition from dual union all         
   select 3 id,sysdate-4 dat,'N' condition from dual union all            
   select 2 id,sysdate-5 dat,'N' condition from dual union all
   select 2 id,sysdate-6 dat,'Y' condition from dual union all
   select 2 id,sysdate dat,'N' condition from dual )
select * from tab1 t
where (t.id,1) in (select id, row_number() OVER (partition by id order by dat desc) as rn from tab2 where condition = 'Y')
...
Рейтинг: 0 / 0
exists и order by
    #39827591
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

*
Код: plsql
1.
where (t.id,1,'Y') in (select id, row_number() OVER (partition by id order by dat desc) as rn, condition from tab2)
...
Рейтинг: 0 / 0
exists и order by
    #39827594
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаStaxчто б о чем-то продолжать, надо увидеть решение без EXISTSJOIN же на предагрегированный по ID inline-view на базе tab2
я ето понимаю (и могу срисовать)

где селект чтоб сравнить с exists?

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


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