powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не отбираются записи при условии Rowid not in
14 сообщений из 14, страница 1 из 1
Не отбираются записи при условии Rowid not in
    #39762732
Landgraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Классическая задачка - удалить дубли.

Код: 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
Не отбираются записи при условии Rowid not in
    #39762744
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Landgraf,

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

ибо - NULL

А где там null получается?
...
Рейтинг: 0 / 0
Не отбираются записи при условии Rowid not in
    #39762756
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Не отбираются записи при условии Rowid not in
    #39762760
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LandgrafЩукина АннаLandgraf,

ибо - NULL

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

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

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

"полечить" можно "материализаций" подзапроса. к примеру, при помощи where rownum >= 1
...
Рейтинг: 0 / 0
Не отбираются записи при условии Rowid not in
    #39762769
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Не отбираются записи при условии Rowid not in
    #39762793
Landgraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна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
Не отбираются записи при условии Rowid not in
    #39762894
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LandgrafТак работает.
Уж ежели непременно not in, то хотя бы так:
Код: plsql
1.
2.
where rowid not in
 (select max(rowid) from TestTable  group by id having count(*) > 1)
...
Рейтинг: 0 / 0
Не отбираются записи при условии Rowid not in
    #39762895
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Код: plsql
1.
2.
where rowid not in
 (select max(rowid) from TestTable  group by id having count(*) > 1)


Наврал. Having не нужен.
...
Рейтинг: 0 / 0
Не отбираются записи при условии Rowid not in
    #39762934
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Не отбираются записи при условии Rowid not in
    #39762937
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxLandgrafЗапрос ничего не возвращает!

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

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

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


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