powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перестановка колонок
11 сообщений из 11, страница 1 из 1
Перестановка колонок
    #40070479
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все знают как добавить колонку к резалтсету, благодаря нотации t.* новые колонки легко добавляются слева или справа.

Такое действие, иногда вынужденное в случае аналитических функций, меняют %ROWTYPE запроса, и пока я не нашел способ удалять произвольную колонку, из резалтсета, приходилось выписывать все алиасы под копирку и надеяться что чужой rowtype не будет часто обновляться. Для обновляемых резалтсетов есть ещё трюк через rownum, который мне показали на этом форуме.

На 12 ещё вроде можно сделать финт со скрытыми колонками, которые не включены в t.*, но мне не актуально.

А вот дальше удаления произвольной названной колонки я не продвинулся. Было бы круто научиться переставлять две произвольные колонки известные по имени, не прибегая к динамическому sql. Поменять местами первые две легко.

Полезность таких умений сомнительна, поэтому на правах головоломки для уважаемых виртуозов.
...
Рейтинг: 0 / 0
Перестановка колонок
    #40070547
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перечитал дважды, нифига не понял.
Что пытаетесь сделать и что не получается?
...
Рейтинг: 0 / 0
Перестановка колонок
    #40070548
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очевидно, он пытается использовать результат запроса со звёздочкой к неизвестным таблицам
в PL/SQL и у него вполне предсказуемо ничего не получается из-за неизвестного количества и
порядка полей в резалт-сете. Но поступить как разумные люди и не использовать звёздочку он
не хочет, поэтому спрашивает совета у опытных проктостоматологов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перестановка колонок
    #40070574
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
Перечитал дважды, нифига не понял.
Что пытаетесь сделать и что не получается?


Головоломка: поменять местами колонки "empno" и "mgr" в резалтсете который, в котором неизвестен полный список столбцов, не прибегая к динамическому SQL. Известно что эти две колонки точно присутствуют, и типы этих двух колонок совпадают.

Я такую головоломку пока не умею решать силами SQL, умею только удалить колонку(-и) из резалтсета.
...
Рейтинг: 0 / 0
Перестановка колонок
    #40070575
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Очевидно, он пытается использовать результат запроса со звёздочкой к неизвестным таблицам
в PL/SQL и у него вполне предсказуемо ничего не получается из-за неизвестного количества и
порядка полей в резалт-сете. Но поступить как разумные люди и не использовать звёздочку он
не хочет, поэтому спрашивает совета у опытных проктостоматологов.


PL/SQL не упоминался, но мне не совсем понятно что у вас не получилось.
Напишите код, попробуем вместе.
...
Рейтинг: 0 / 0
Перестановка колонок
    #40070579
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уж не помню когда мне в последний раз мешала лишняя колонка, придумал вот такой пример:

Известно, что подавляющему большинству системных объектов возвращаемых из SYS.???_OBJECTS присвоен уникальный порядковый номер объекта, object_id. Пронаблюдав, как у новых объектов этот ключ обычно растет, можно предположить что там какой нибудь счетчик (напр, сиквенс) который выдает возрастающие натуральные числа.

Гипотезы требуют проверки. Отсортируем все объекты схемы по дате создания, и посмотрим бывает ли чтобы у более позднего объекта случился меньший object_id:

Код: plsql
1.
2.
3.
4.
5.
6.
with rev(object_id,diff) as (
  select object_id, 
         created -lag(created) over (order by object_id)
    from USER_OBJECTS
)
select count(*) from rev where diff < 0



У меня получилось 33. Т.е. если доверять дате создания объекта в системной вьюхе USER_OBJECTS, счетчик объектов не всегда возрастает монотонно со временем. Хотелось бы на некоторые из них посмотреть в формате USER_OBJECTS%ROWTYPE.

Нам повезло: USER_OBJECTS есть PK, задача решается через джойн по уникальному значению.
Код: plsql
1.
2.
3.
select u.* from USER_OBJECTS u 
  join rev on u.object_id = rev.object_id
 where diff < 0



А если уникального значения нет, и первоначальный резалт сет не является "row-preserving", то приходится сначала добавлять колонку для фильтрации, а потом ее удалять:
Код: plsql
1.
2.
3.
4.
5.
6.
with rev as (
  select u.*,
         created -lag(created) over (order by object_id) as diff
    from USER_OBJECTS u
)
select * from rev u where diff < 0 -- не забыть удалить последний столбец, вернуть к %ROWTYPE



Ну или было еще предложение набивать ручками все поля чужого резалтсета, а потом зорко следить чтоб как только поменяется, сразу тоже у себя поменять. Чё, и текста много, и гарантия занятости.

Код: 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.
with rev as (
  select 
        object_name,     -- звездочки
        subobject_name,  -- это 
        object_id,       -- для
        data_object_id,  -- говнокодеров
        object_type, 
        created, 
        last_ddl_time, 
        timestamp, 
        status, 
        temporary, 
        generated, 
        secondary, 
        namespace, 
        edition_name,
        created -lag(created) over (order by object_id) as diff
    from USER_OBJECTS u
)
select
      object_name,     -- легких
      subobject_name,  -- путей
      object_id,       -- не 
      data_object_id,  -- ищем
      object_type, 
      created, 
      last_ddl_time, 
      timestamp, 
      status, 
      temporary, 
      generated, 
      secondary, 
      namespace, 
      edition_name
  from rev
 where diff < 0;

...
Рейтинг: 0 / 0
Перестановка колонок
    #40070614
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLPL/SQL не упоминался

Упоминался %ROWTYPE, который существует только в нём.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Перестановка колонок
    #40070653
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLPL/SQL не упоминался

Упоминался %ROWTYPE, который существует только в нём.


Придирка наверное резонная. Я использовал слова "такой же %ROWTYPE" чтобы донести до читателя что целью является предохранение или восстановление количества, порядка, типов и наименований колонок.

Как вам нравится "чтоб union и intersect работал между первоначальным резалтсетом, и преобразованным"?

Больше слов чем "одинаковый %ROWTYPE", зато не использует PL/SQL терминологию, которая вводит в заблуждение.
...
Рейтинг: 0 / 0
Перестановка колонок
    #40070655
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Научился переставлять в произвольном порядке левые или правые N колонок произвольного резалтсета, но с колонками в середине резалтсета пока напряг. Не уверен, что это под силу SQL.
...
Рейтинг: 0 / 0
Перестановка колонок
    #40070730
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
чтоб union и intersect работал между первоначальным резалтсетом, и преобразованным


Смысла в этом извращении не увидел, но можно сделать unpivot и дальше работать с key-value структурой.
...
Рейтинг: 0 / 0
Перестановка колонок
    #40070781
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
чтоб union и intersect работал между первоначальным резалтсетом, и преобразованным


Смысла в этом извращении не увидел, но можно сделать unpivot и дальше работать с key-value структурой.


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


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