powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переписать запрос
10 сообщений из 10, страница 1 из 1
Переписать запрос
    #39321426
Brahmaputr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table test
as
select 1 id, 12 f1, 77 f2 from dual
union all
select 2 id, null f1, 77 f2 from dual
union all
select 3 id, 12 f1, null f2 from dual
---------
union all
select 5 id, 13 f1, 79 f2 from dual
union all
select 6 id, null f1, 79 f2 from dual
union all
select 7 id, 13 f1, null f2 from dual


Итого данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
        ID         F1         F2
---------- ---------- ----------
         1         12         77
         2                    77
         3         12 
         5         13         79
         6                    79
         7         13 
При этом записи 1, 2, 3 относятся к одной сущности/объекту.
А записи с id 5, 6, 7 к другой.
Задача при поиске или по f1, или по f2 определить эти сущности, то есть достать все записи.

Т.е. запрос к таблице может идти либо по полю f1, либо по полю f2,
т.е. два входных параметра, если задан первый по f1, то ищем только по нему.
Но, исходя из данных и сути задачи, доставать записи надо бы по цепочке.
То есть если ищем по f1 = 12, то помимо записей 1 и 3, надо достать и запись с id = 2 через
найденное значение f2 = 77 в первой записи.

Например, ищем по f1 = 12, должны получить результат:
Код: plaintext
1.
2.
3.
4.
5.
        ID         F1         F2        GRP         RN
---------- ---------- ---------- ---------- ----------
         1         12         77          1          1
         2                    77          1          1
         3         12                     1          1
Или например ищем по f2 = 79:
Код: plaintext
1.
2.
3.
4.
5.
        ID         F1         F2        GRP         RN
---------- ---------- ---------- ---------- ----------
         5         13         79          1          1
         6                    79          1          1
         7         13                     1          1

При этом нельзя использовать ни коннект бай, ни рекурсивный запрос.

Пока написал что-то похожее, но можно ли упростить?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t0 as (select t.*, 
                   dense_rank() over(partition by nvl2(&p1, f2, f1) order by 1) grp
              from test t 
             where (&p1 is not null and f1 = &p1)
                or (&p1 is null and f2 = &p2)),
     t1 as (select * from t0
             union all
            select t.*, t0.grp 
              from test t, t0
             where (&p1 is not null and t.f2 = t0.f2)
                or (&p1 is null and t.f1 = t0.f1)),
     t2 as (select t1.*, row_number() over(partition by id order by id) rn
              from t1)
     select * 
       from t2 where rn = 1 order by id
...
Рейтинг: 0 / 0
Переписать запрос
    #39321443
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Brahmaputr,

Код: 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.
SQL> with t as (
  2             select  id,
  3                     f1,
  4                     f2,
  5                     last_value(f1) ignore nulls over(order by id) group_f1,
  6                     last_value(f2) ignore nulls over(order by id) group_f2
  7               from  test
  8            )
  9  select  id,
 10          f1,
 11          f2
 12    from  t
 13    where group_f2 = 79
 14  /

        ID         F1         F2
---------- ---------- ----------
         5         13         79
         6                    79
         7         13

SQL> with t as (
  2             select  id,
  3                     f1,
  4                     f2,
  5                     last_value(f1) ignore nulls over(order by id) group_f1,
  6                     last_value(f2) ignore nulls over(order by id) group_f2
  7               from  test
  8            )
  9  select  id,
 10          f1,
 11          f2
 12    from  t
 13    where group_f1 = 12
 14  /

        ID         F1         F2
---------- ---------- ----------
         1         12         77
         2                    77
         3         12

SQL> 



SY.
...
Рейтинг: 0 / 0
Переписать запрос
    #39321464
SY,

смежность id - домыслы
...
Рейтинг: 0 / 0
Переписать запрос
    #39321478
BrahmaputrПри этом нельзя использовать ни коннект бай, ни рекурсивный запрос.огласите весь список!
...
Рейтинг: 0 / 0
Переписать запрос
    #39321505
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без рекурсий соси мурсий
смежность id - домыслы

Ну ежели сам Brahmaputra сказал то видимо так в его ведах записано.

SY.
...
Рейтинг: 0 / 0
Переписать запрос
    #39321513
Brahmaputr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, да этот запрос будет работать на этих конкретных данных, но id действительно не последовательны внутри каждого объекта. И таблица большая, то есть делать в запросе изначально над всей таблицей аналитику может быть негуд имхо, еще как вариант, заранее проставить группы (по сути id самих объектов), добавив новое поле в таблицу и заполнять его отдельной процедурой всякий раз при добавлении новых данных.
...
Рейтинг: 0 / 0
Переписать запрос
    #39321575
Brahmaputr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача усложняется:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table test
as
select 1 id, 12 f1, 77 f2, 15 f3 from dual
union all
select 2 id, null f1, 77 f2, 15 f3 from dual
union all
select 9 id, 12 f1, null f2, 15 f3 from dual
---------
union all
select 5 id, 13 f1, 79 f2, 15 f3 from dual
union all
select 6 id, null f1, 79 f2, 15 f3 from dual
union all
select 7 id, 13 f1, null f2, 15 f3 from dual


Добавили поле f3, которое объединяет описанные выше два объекта в тестовых данных.
Задача при поиске по f3 пронумеровать каждый объект по предыдущим условиям задачи, то есть на выходе получить obj_id:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
        ID         F1         F2         F3     OBJ_ID
---------- ---------- ---------- ---------- ----------
         1         12         77         15          1 
         2                    77         15          1 
         3         12                    15          1
         5         13         79         15          2
         6                    79         15          2  
         7         13                    15          2
Можно использовать рекурсию.
И как достать данные рекурсивно еще понятно, но как разделить/пронумеровать, не ясно.
...
Рейтинг: 0 / 0
Переписать запрос
    #39321581
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BrahmaputrМожно использовать рекурсию.
И как достать данные рекурсивно еще понятно, но как разделить/пронумеровать, не ясно. Получить множество из связанных пар
...
Рейтинг: 0 / 0
Переписать запрос
    #39321594
Brahmaputr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, спасибо, похоже, оно.
...
Рейтинг: 0 / 0
Переписать запрос
    #39322165
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Brahmaputrда этот запрос будет работать на этих конкретных данных, но id действительно не последовательны внутри каждого объекта.

А тому решению по барабану - последовательны или с дырками, главное чтобы увеличивались.

BrahmaputrЗадача усложняется.

Да ну?

Код: 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.
44.
45.
46.
47.
48.
49.
SQL> with t as (
  2             select  id,
  3                     f1,
  4                     f2,
  5                     f3,
  6                     last_value(f1) ignore nulls over(partition by f3,f2 order by id) group_f1,
  7                     last_value(f2) ignore nulls over(partition by f3,f1 order by id) group_f2
  8               from  test
  9            )
 10  select  id,
 11          f1,
 12          f2,
 13          f3,
 14          dense_rank() over(order by group_f1) obj_id
 15    from  t
 16    where group_f1 = 12
 17  /

        ID         F1         F2         F3     OBJ_ID
---------- ---------- ---------- ---------- ----------
         1         12         77         15          1
         2                    77         15          1
         9         12                    15          1

SQL> with t as (
  2             select  id,
  3                     f1,
  4                     f2,
  5                     f3,
  6                     last_value(f1) ignore nulls over(partition by f3,f2 order by id) group_f1,
  7                     last_value(f2) ignore nulls over(partition by f3,f1 order by id) group_f2
  8               from  test
  9            )
 10  select  id,
 11          f1,
 12          f2,
 13          f3,
 14          dense_rank() over(order by group_f1) obj_id
 15    from  t
 16    where group_f2 = 79
 17  /

        ID         F1         F2         F3     OBJ_ID
---------- ---------- ---------- ---------- ----------
         5         13         79         15          1
         7         13                    15          1
         6                    79         15          1

SQL> 



Надеюсь F1 уникальный для комбинации F3,F2 a F2 для комбинации F3,F1.

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


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