Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переписать запрос / 10 сообщений из 10, страница 1 из 1
05.10.2016, 21:11
    #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
05.10.2016, 22:04
    #39321443
SY
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
05.10.2016, 23:34
    #39321464
Переписать запрос
SY,

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

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

SY.
...
Рейтинг: 0 / 0
06.10.2016, 06:11
    #39321513
Brahmaputr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать запрос
SY, да этот запрос будет работать на этих конкретных данных, но id действительно не последовательны внутри каждого объекта. И таблица большая, то есть делать в запросе изначально над всей таблицей аналитику может быть негуд имхо, еще как вариант, заранее проставить группы (по сути id самих объектов), добавив новое поле в таблицу и заполнять его отдельной процедурой всякий раз при добавлении новых данных.
...
Рейтинг: 0 / 0
06.10.2016, 08:56
    #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
06.10.2016, 09:03
    #39321581
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать запрос
BrahmaputrМожно использовать рекурсию.
И как достать данные рекурсивно еще понятно, но как разделить/пронумеровать, не ясно. Получить множество из связанных пар
...
Рейтинг: 0 / 0
06.10.2016, 09:20
    #39321594
Brahmaputr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переписать запрос
Elic, спасибо, похоже, оно.
...
Рейтинг: 0 / 0
06.10.2016, 17:09
    #39322165
SY
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переписать запрос / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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