Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не отбираются записи при условии Rowid not in / 14 сообщений из 14, страница 1 из 1
22.01.2019, 12:27
    #39762732
Landgraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
Всем привет!
Классическая задачка - удалить дубли.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
create table TestTable as

       select level as id from dual connect by level <=3

       union all

       select level as id from dual connect by level <=3



Выполним группировку по полю id, возьмём max по rowid, а далее удалим все записи у которых rowid не входит в полученный нами набор. Перед этим посмотрим, какие записи отбираются.

Первый вариант, используем функцию group by
Код: plsql
1.
2.
3.
4.
5.
select * from TestTable where rowid not in

       (select max(rowid) from TestTable

           group by id)



Все ок! Строки возвращаются.

Второй вариант, попробуем использовать аналитическую функцию:

Код: sql
1.
2.
3.
select * from TestTable where rowid not in

       (select max(rowid) over (partition by id) from TestTable)



Запрос ничего не возвращает! Хотя набор rowid в подзапросе присутствует. Если убрать условие not, оставить только проверку на вхождение, то запрос возвращает записи.
Почему второй вариант, с использованием not in, не возвращает записи?
...
Рейтинг: 0 / 0
22.01.2019, 12:44
    #39762744
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
Landgraf,

ибо - NULL
...
Рейтинг: 0 / 0
22.01.2019, 12:52
    #39762755
Landgraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
Щукина АннаLandgraf,

ибо - NULL

А где там null получается?
...
Рейтинг: 0 / 0
22.01.2019, 12:53
    #39762756
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
Код: plsql
1.
2.
select * from TestTable t
where exists (select 1 from TestTable t1 where t1.id = t.id and t1.rowid > t.rowid)
...
Рейтинг: 0 / 0
22.01.2019, 12:57
    #39762760
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
LandgrafЩукина АннаLandgraf,

ибо - NULL

А где там null получается?это невнимательность. Увидев NOT IN и "не возвращает данные", подумалось про NULL. А перед тем как думать - нужно ещё было и до конца ваш пост дочитать... :)

З.Ы.
Версия oracle, кстати, какая?
...
Рейтинг: 0 / 0
22.01.2019, 12:58
    #39762763
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
Landgraf,

план с прожекцией посмотри. потом добавь алиасы таблиц.
...
Рейтинг: 0 / 0
22.01.2019, 13:01
    #39762766
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
Landgraf,

"полечить" можно "материализаций" подзапроса. к примеру, при помощи where rownum >= 1
...
Рейтинг: 0 / 0
22.01.2019, 13:02
    #39762769
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
Landgraf,

как-то так:
Код: plsql
1.
2.
3.
select * from TestTable where rowid not in

       (select max(rowid) over (partition by id) from TestTable where rownum >= 1)



Причины -2- озвучил...
...
Рейтинг: 0 / 0
22.01.2019, 13:19
    #39762793
Landgraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
Щукина АннаLandgraf,

как-то так:
Код: plsql
1.
2.
3.
select * from TestTable where rowid not in

       (select max(rowid) over (partition by id) from TestTable where rownum >= 1)



Причины -2- озвучил...


Так работает. А в чем суть такой проблемы, так сказать особенность такого поведения? Первый раз с таким столкнулся.
...
Рейтинг: 0 / 0
22.01.2019, 15:09
    #39762894
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
LandgrafТак работает.
Уж ежели непременно not in, то хотя бы так:
Код: plsql
1.
2.
where rowid not in
 (select max(rowid) from TestTable  group by id having count(*) > 1)
...
Рейтинг: 0 / 0
22.01.2019, 15:10
    #39762895
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
andrey_anonymous
Код: plsql
1.
2.
where rowid not in
 (select max(rowid) from TestTable  group by id having count(*) > 1)


Наврал. Having не нужен.
...
Рейтинг: 0 / 0
22.01.2019, 15:51
    #39762934
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
LandgrafЗапрос ничего не возвращает!


Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  1  select * from emp where rowid not in
  2*        (select max(rowid) over (partition by deptno) from emp)
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17.12.80        800                    20
      7499 ALLEN      SALESMAN        7698 20.02.81       1600        300         30
      7521 WARD       SALESMAN        7698 22.02.81       1250        500         30
      7566 JONES      MANAGER         7839 02.04.81       2975                    20
      7654 MARTIN     SALESMAN        7698 28.09.81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01.05.81       2850                    30
      7782 CLARK      MANAGER         7839 09.06.81       2450                    10
      7788 SCOTT      ANALYST         7566 09.12.82       3000                    20
      7839 KING       PRESIDENT            17.11.81       5000                    10
      7844 TURNER     SALESMAN        7698 08.09.81       1500                    30
      7876 ADAMS      CLERK           7788 12.01.83       1100                    20

11 rows selected.



.....
stax
...
Рейтинг: 0 / 0
22.01.2019, 15:55
    #39762937
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
StaxLandgrafЗапрос ничего не возвращает!

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
Ну глюканул CBO у коллеги, бывает.
Лучше бы отметили неуместность использования аналитики в подобной конструкции...
...
Рейтинг: 0 / 0
22.01.2019, 18:09
    #39763030
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отбираются записи при условии Rowid not in
andrey_anonymousЛучше бы отметили неуместность использования аналитики в подобной конструкции...
удаление дублей, я посчитал как пример глюка

в реальности мож они что-то другое делают (решают), напр оставить не больше трех строк

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


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