#sql #oracle #hierarchy
Вопрос:
Мне нужна ваша помощь в этом вопросе;
Fiedl1_Id Fiedl1 Fiedl2_Id Fiedl2
2470 199T 2348 949T
2470 199T 2349 699T
2470 199T 2356 649T
2470 199T 2379 399T
2470 199T 2383 299T
2470 199T 2470 199T
Я хочу внедрить в свой sql-запрос код для добавления в этот вывод запроса новой глубины поля, принцип которого заключается в следующем:
Fiedl1_Id Fiedl1 Fiedl2_Id Fiedl2 Depth
2470 199T 2348 949T 1
2470 199T 2348 949T 2
2470 199T 2348 949T 3
2470 199T 2348 949T 4
2470 199T 2348 949T 5
2470 199T 2349 699T 1
2470 199T 2349 699T 2
2470 199T 2349 699T 3
2470 199T 2349 699T 4
2470 199T 2356 649T 1
2470 199T 2356 649T 2
2470 199T 2356 649T 3
2470 199T 2379 399T 1
2470 199T 2379 399T 2
2470 199T 2383 299T 1
2470 199T 2470 199T 0
У меня было 6 записей, в том числе запись с идентификатором Fiedl1_Id = Fiedl2_Id ( 2470), для других эта запись должна иметь глубину = 0; 5 глубин для первого значения Fiedl2(949T), 4 глубины для (699T) и так далее в порядке убывания.
Комментарии:
1. На самом деле никакой иерархии не существует. Почему у вас есть 5 значений «глубины» для 2348, но только 1 для 2382 — вы действительно просто применяете ранг, основанный на идентификаторе или значении field2 (по убыванию), а не на реальной иерархии?
2. Строгого объяснения того, откуда берется глубина, нет, но я знаю, что вам нужен такой синтаксис
connect by prior t1.rowid = t1.rowid and level <= depth and prior sys_guid() is not null
3. спасибо за ваш отзыв, у меня есть 5 разных записей из одного 199T, которые являются следующими: 949T, 699T, 649T, 399T, 299T. Этот список упорядочен по идентификатору Fiedl2_Id asc (упорядочен по росту идентификатором Fiedl2_Id); Я хочу, чтобы первое значение(949T) повторялось 5 раз(количество 5 разных записей, исключая 199T, у которых Fiedl1_Id= Fiedl2_Id) с разной глубиной, затем для второго значения(699T) повторялось 4 раза с разной глубиной, для 649T повторялось 3 раза …..
Ответ №1:
Это дает вам желаемый результат для данного ввода:
WITH t (fiedl1_id,fiedl1,fiedl2_id,fiedl2)
AS
(
SELECT '2470','199T','2348','949T' FROM DUAL UNION ALL
SELECT '2470','199T','2349','699T' FROM DUAL UNION ALL
SELECT '2470','199T','2356','649T' FROM DUAL UNION ALL
SELECT '2470','199T','2379','399T' FROM DUAL UNION ALL
SELECT '2470','199T','2383','299T' FROM DUAL UNION ALL
SELECT '2470','199T','2470','199T' FROM DUAL
), t_rn (fiedl1_id,fiedl1,fiedl2_id,fiedl2,rn)
AS
(
SELECT fiedl1_id,fiedl1,fiedl2_id,fiedl2,ROW_NUMBER() OVER(ORDER BY 1) FROM t ORDER BY fiedl2 ASC
), t_depth (fiedl1_id,fiedl1,fiedl2_id,fiedl2,fdepth)
AS
(
SELECT fiedl1_id,fiedl1,fiedl2_id,fiedl2,rn - 1 FROM t_rn
UNION ALL
SELECT fiedl1_id,fiedl1,fiedl2_id,fiedl2,fdepth - 1 FROM t_depth WHERE fdepth - 1 > 0
)
SELECT * FROM t_depth order by fiedl2 DESC, fdepth ASC;
FIED FIED FIED FIED FDEPTH
---- ---- ---- ---- ----------
2470 199T 2348 949T 1
2470 199T 2348 949T 2
2470 199T 2348 949T 3
2470 199T 2348 949T 4
2470 199T 2348 949T 5
2470 199T 2349 699T 1
2470 199T 2349 699T 2
2470 199T 2349 699T 3
2470 199T 2349 699T 4
2470 199T 2356 649T 1
2470 199T 2356 649T 2
2470 199T 2356 649T 3
2470 199T 2379 399T 1
2470 199T 2379 399T 2
2470 199T 2383 299T 1
2470 199T 2470 199T 0
Комментарии:
1. большое вам спасибо, это то, что я ищу
2. Приятно это слышать.