Лучший способ в Oracle перейти от этих данных к этому результату - PullRequest
1 голос
/ 10 июля 2009

Как лучше всего в oracle получить следующий набор результатов из таблицы, подобной этой:

GROUP ID VALUE
--------------------
1       1       A
1       2       B
1       3       C
2       4       D
2       5       E
3       6       F
4       7       G
4       8       H


ID  Parent  VALUE
---------------------
1       0       A
2       1       B
3       2       C
4       0       D
5       4       E
6       0       F
7       0       G
8       7       H

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

Смысл этого состоит в том, чтобы добавить его к соединению по запросу и вернуть значения в одном столбце, разделенном запятыми.

Теперь я могу сделать это с помощью множества подзапросов и функций задержки, но кажется, что есть более быстрый способ сделать это.

Или ... я что-то упустил и могу напрямую использовать команду connect по исходным данным на исходных данных. Это было бы оптимально!

EDIT

Кажется, я мог запутать ситуацию. Моя конечная цель (но не вопрос здесь) состоит в том, чтобы запросить группу № 1 и получить результат A, B, C в виде строки в одном столбце.

Я знаю, как это сделать с помощью предложения Connect by. Это не проблема.

Проблема в том, что для использования предложения connect by вы должны фактически располагать данные в иерархическом формате.

Это то, что я ищу для более эффективного способа.

Ответы [ 2 ]

2 голосов
/ 10 июля 2009

Есть ли какие-либо проблемы, которые мешают вам сделать:

SELECT t.ID,
       NVL((SELECT MAX(t2.ID)
              FROM Table t2
             WHERE t.GROUP = t2.GROUP
               AND t2.ID < t.ID), 0)      AS Parent_ID ,
       t.Value
  FROM TABLE t

Может быть, вы предпочли Connect By Query, но если производительность не слишком плохая, я чувствую, что это довольно просто. Если производительность важна для вас, вы можете попробовать что-то вроде.

WITH aux AS( SELECT ID,
                     Value,
                     Group,
                     dense_rack() ( partition by GROUP order by ID) AS num
                FROM TABLE )

         SELECT t1.ID,
                t2.ID  AS parent,
                t1.Value
           FROM ( select * from aux ) t1  
      LEFT JOIN ( select * from aux ) t2 
             ON t1.group = t2.group 
            AND t1.ID    = t2.ID -1
1 голос
/ 10 июля 2009

После переваривания ответа Боржаба я нашел другой быстрый способ сделать это с помощью функции задержки:

SELECT t.ID,
       LAG(ID,1,0) OVER (PARTITION BY GROUP ORDER BY ID) AS Parent_ID ,
       t.Value
FROM TABLE t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...