Как использовать различные оракулы и одновременно заказывать братьев и сестер?

отдельные нарушенные братья и сестры по порядку, как я могу использовать их одновременно? такие как выбрать отдельный * из таблицы xxx начинается с ... подключить по id = pid порядок братьев и сестер по полю вот тестовые sql, выполненные с разными результатами

select distinct * from test_table start with pid is null connect by prior id=pid order siblings by order_num;

select * from test_table start with pid is null connect by prior id=pid order siblings by order_num;

вот стол

create table TEST_TABLE(id NUMBER,pid NUMBER,order_num NUMBER);
insert into TEST_TABLE (id, pid, order_num) values (1, null, 1);
insert into TEST_TABLE (id, pid, order_num) values (2, 1, 5);
insert into TEST_TABLE (id, pid, order_num) values (3, null, 2);
insert into TEST_TABLE (id, pid, order_num) values (4, 1, 4);
insert into TEST_TABLE (id, pid, order_num) values (5, 3, 2);

Пожалуйста, редактировать вопрос, чтобы включить минимальный воспроизводимый пример с: утверждением CREATE TABLE для вашей таблицы; заявление INSERT для ваших образцов данных; полный запрос, который мы можем выполнить; и ожидаемый результат для этого запроса. Очень сложно ответить на абстрактный вопрос, так как мы должны угадывать конкретный пример, демонстрирующий проблему, и надеяться, что он соответствует тому, о чем вы думаете; если ТЫ предоставит этот пример (в формате, который мы можем скопировать/вставить и выполнить), вы получите ответ на вопрос, на который хотите получить ответ.

MT0 12.05.2022 11:48
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать ORDER SIBLINGS BY во внутреннем запросе, а затем использовать аналитическую функцию ROW_NUMBER(), чтобы найти дубликаты во внешнем запросе и сохранить порядок, используя ORDER BY ROWNUM в этом внешнем запросе:

SELECT id, pid, order_num
FROM   (
  SELECT id, pid, order_num,
         ROW_NUMBER() OVER (PARTITION BY id, pid, order_num ORDER BY ROWNUM) AS rn
  FROM   (
    SELECT id, pid, order_num
    FROM   test_table
    START WITH pid IS NULL
    CONNECT BY PRIOR id = pid
    ORDER SIBLINGS BY order_num
  )
  ORDER BY ROWNUM
)
WHERE  rn = 1

Что для примера данных:

create table TEST_TABLE(id,pid,order_num) AS
SELECT 1, NULL, 1 FROM DUAL UNION ALL
SELECT 2, 1, 5 FROM DUAL UNION ALL
SELECT 3, NULL, 2 FROM DUAL UNION ALL
SELECT 4, 1, 4 FROM DUAL UNION ALL
SELECT 5, 3, 2 FROM DUAL UNION ALL
SELECT 1, 5, 5 FROM DUAL;

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

Выходы:

IDPIDORDER_NUM
1null1
414
215
3null2
532
155

и поддерживает порядок братьев и сестер из иерархического запроса.

дб <> рабочий пример здесь

Я сожалею об этом, дубликата нет в таблице инициализации. Это произошло при подключении по предыдущему id=pid, я покажу вам образцы данных позже

JokerSora 12.05.2022 12:08

Извините, вы правы. В таблице инициализации есть повторяющиеся записи .... просто различайте их, а затем выполните подключение

JokerSora 12.05.2022 12:17

@JokerSora Вы можете получить дубликаты на выходе, не имея дубликатов на входе, когда у вас есть слияние нескольких ветвей (я обновил ответ на ваши образцы данных с добавленной строкой, которая демонстрирует этот случай), поэтому вам все еще может потребоваться отфильтровать дубликаты после. Однако, если ваша проблема заключалась в дублировании входных данных, тогда да, просто сначала используйте DISTINCT, а затем создайте иерархию.

MT0 12.05.2022 12:19

Другие вопросы по теме