powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как выбрать топовые пути sql-ем
22 сообщений из 22, страница 1 из 1
как выбрать топовые пути sql-ем
    #39408536
AlexVin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oracle 12

в столбце есть неограниченное (1-n) небольшое количество путей к каталогам ос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual
) 
select p from a


можно ли только sql-ем выбрать строки, исключив встречающиеся среди данных подкаталоги?
(в примере /opt1/baza/tut/ и /usr/local/lib/ в выборку попасть не должны)
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408547
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexVinможно ли только sql-ем выбрать строки, исключив встречающиеся среди данных подкаталоги?Self join + not like
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408622
ln123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexVin,

Код: plsql
1.
select p from a where not exists (select 1 from a a1 where a.p like a1.p||'%' and a.p != a1.p)
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408645
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ln123,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual
) 
select p from a
 where p     like '/%/%/%' 
   and p not like '/%/%/_%';
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408647
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexVinнеограниченное (1-n) небольшое количество путейjust for fun за одно сканирование
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual
) 
, b as (select p, regexp_substr(p, '(/[^/]+){' || level || '}') token
          from a
       connect by prior p = p and level < regexp_count(p, '/') and prior sys_guid() is not null)
, c as (select b.*, count(*) over (partition by p) cnt from b)
, d as (select c.*, min(cnt) over (partition by token) m from c)
select p
  from d
group by p
having min(cnt) = min(m)
order by 1
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408655
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё баян
Код: plsql
1.
2.
select p from a
 where length(p)-length(replace (p,'/')) <= 3;
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408663
кто тут?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop just for fun

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with tst(path) as (
  select '/opt/base/'       from dual union all
  select '/opt/baza/'       from dual union all
  select '/op/baza/'        from dual union all
  select '/opt1/'           from dual union all
  select '/opt1/baza/tut/'  from dual union all
  select '/usr/local/'      from dual union all
  select '/usr/local/lib/'  from dual
) 
select path from 
(
select
  tst1.path, 
  count(tst1.path) over(partition by tst1.path) cnt
from       tst tst1
inner join tst tst2 on instr(tst1.path, tst2.path) <> 0
) where cnt = 1;
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408676
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawishещё баянОба "решения" неправильные даже если принимать, что глубина не более трех уровней.


кто тут?,
Может так лучше дойдет
dbms_photoshopjust for fun за одно сканирование (вместо connect by для "размножения строк" можно использовать множество других альтернатив)

А вообще, если максимальная вложенность заранее известна, то задача - частный случай Пятничная задачка. Схлопывание кортежей.
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408681
кто тут?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop, кто дойдет? куда? Я всего лишь использовал твою крутую фразу "just for fun" для своего решения.
И то, что я написал никак не претендует на "Оптимальное решение года". Извини.
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408696
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with tst(path) as (
  select '/opt/base/'       from dual union all
  select '/opt/baza/'       from dual union all
  select '/op/baza/'        from dual union all
  select '/opt1/'           from dual union all
  select '/opt1/baza/tut/'  from dual union all
  select '/opt1/baza/tut/1'  from dual union all
  select '/opt1/baza/tut/1/2'  from dual union all
  select '/usr/local/'      from dual union all
  select '/usr/local/lib/'  from dual
) 
select t1.path
from       tst t1
left join  tst t2 on t1.path like t2.path || '%' and t1.path != t2.path
where t2.path is null;
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408699
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто тут?,

Опубликованное мной тоже на оптимальность не претендует (хотя можно придумать данные для которых уход от само-соединения имеет смысл).
Цитирование обычно подразумевает, что ты обращаешься или комментируешь, если не сказано иное.
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408744
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Попробовал match_recognize
Код: 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.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual union all
select '/usr/local/share/' p from dual
) 
select *
  from a 
  match_recognize(
     order by p  
     measures 
        strt.p start_p
     one row per match 
     after match skip past last row 
     pattern(strt down+ same* | strt down*) 
     define 
       down as down.p like prev(down.p)||'%'
      ,same as regexp_replace(same.p,'[^/]+\/$') = regexp_replace(prev(same.p),'[^/]+\/$') 
 ) mr
/
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408753
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderПопробовал match_recognize
Код: 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.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual union all
select '/usr/local/share/' p from dual
) 
select *
  from a 
  match_recognize(
     order by p  
     measures 
        strt.p start_p
     one row per match 
     after match skip past last row 
     pattern(strt down+ same* | strt down*) 
     define 
       down as down.p like prev(down.p)||'%'
      ,same as regexp_replace(same.p,'[^/]+\/$') = regexp_replace(prev(same.p),'[^/]+\/$') 
 ) mr
/

Лучше в логике использовать проверку "подкаталогов" на вхождение первой строки матча. Иначе результат может быть неверный.
Код: plsql
1.
2.
3.
4.
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual union all
select '/usr/local/lib/aaa/' p from dual union all
select '/usr/local/share/' p from dual
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408761
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
pattern(x+)
define x as p like first(p) || '%'
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408766
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop
Код: plaintext
1.
pattern(x+)
define x as p like first(p) || '%'


Код: 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.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual union all
select '/usr/local/share/' p from dual
)
select *
  from a
  match_recognize(
     order by p
     measures
        first(p) start_p
     one row per match
     pattern(down+)
     define
       down as p like replace(replace(first(p),'_','\_'),'%','\%') || '%' escape '\'
 ) mr
/

START_P
-----------------
/op/baza/
/opt/base/
/opt/baza/
/opt1/
/usr/local/

SQL> 



Предолагается всe пути к каталогам имеют / в начале и в конце.

SY.
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408767
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop,

кстати, я правильно понимаю, что match_recognize не умеет ветвить цепочки от одного корня?
то есть нельзя получить из
/a/
/a/b/
/a/b/x
/a/c/
/a/c/y

2 цепочки:
/a/
/a/b/
/a/b/x
и
/a/
/a/c/
/a/c/y
?
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408780
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderкстати, я правильно понимаю, что match_recognize не умеет ветвить цепочки от одного корня?Можно регулировать старт указывая разные опции в
Код: plaintext
after match ...
Но старт в любом случае должен быть хотя бы на следующей строке.
Иначе словишь что-то в духе: ORA-ххххх текущий матч начинается там же где и предыдущий.
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408805
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop,

в твоей книге это не разъяснено :(
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408855
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad
Код: plsql
1.
t1.path like t2.path || '%' and t1.path != t2.path

Код: plsql
1.
  t1.path like t2.path || '_%'
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408951
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderdbms_photoshop,

в твоей книге это не разъяснено :(Была попытка выдержать баланс между объяснением возможности-ограничения и углублением в детали.
Конкретно этот момент проблематично сформулировать одним абзацем, чтоб понятно было тому, кто сам не сталкивался.
Некоторые дополнительные ограничения будут во второй части, где будет описано решение конкретных задач.
По мелочам, конечно, еще и первую часть "причешу" с учетом замечаний.
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39408974
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexVin,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual
) 
select substr(p,1,instr(substr(p,2,100),'/')+1), count(*) from a
group by substr(p,1,instr(substr(p,2,100),'/')+1)
order by 2 desc
...
Рейтинг: 0 / 0
как выбрать топовые пути sql-ем
    #39409015
Фанат Elic-а
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo, что это?
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как выбрать топовые пути sql-ем
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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