2009-10-21 4 views
4

Существует проблема, которая не знает, как разрешать только с помощью SQL (я мог бы сделать это с помощью PL/SQL, но это должно выполняться только с SQL).Обработка данных в Oracle SQL

У меня есть таблица (на самом деле это не таблица, а результат с запросом) с содержат пару значений, как это:

 
    column1 column2 
--------- --------- 
    value1 value2 
    value1 value3 
    value2 value4 
    value3 value7 
    value8 value9 

вывод я хочу для этих данных будет (я дон «т забота о порядке):

 
    output_column 
--------------- 
    value1, value2, value3, value4, value7 
    value8, value9 

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

Каждая пара во входной таблице уникальна (младшее значение всегда слева, и я использовал отдельный для вычисления таблицы ввода).

У меня нет абсолютно никакого понятия о том, как это сделать с моделью, и мои усилия с подключением, жалуются на «круговые данные». Это сначала не выглядит тяжелым, но не может понять, как это сделать не процедурным способом. Есть предположения?

Заранее спасибо.

ответ

4

Следующий запрос будет работать с набором данных:

SQL> SELECT root || ',' || stragg(DISTINCT column2) 
    2 FROM (SELECT CONNECT_BY_ROOT(column1) root, t.* 
    3    FROM t 
    4   CONNECT BY PRIOR column2 = column1 
    5   START WITH column1 IN (SELECT column1 
    6          FROM t 
    7         WHERE column1 NOT IN (SELECT column2 
    8               FROM t))) v 
    9 GROUP BY root; 

ROOT||','||STRAGG(DISTINCTCOLU 
----------------------------------------- 
value1,value2,value3,value4,value7 
value8,value9 

Я использую Tom Kyte's concatenation stragg функцию.

+0

Поскольку SeriousCallersOnly указал, я не смог показать, как данные могут быть круговыми. Я добавил nocycle к подключению, и запрос, кажется, работает нормально. Большое спасибо Винсент. Я многому научился. – Samuel

3

Прежде всего, я проверил бы ваши данные. Данные примера, которые вы предоставили, не выглядят круговыми и соединяются, а не с ошибкой.

Если данные следующим образом, то это будет ошибка:

column1 column2 
--------- --------- 
    value1 value2 
    value1 value3 
    value2 value4 
    value3 value7 
**value7 value1** 
    value8 value9 

В Oracle 10g можно указать NOCYCLE для оракула, чтобы вернуть строки, даже если CONNECT BY LOOP существует.

+2

Вы совершенно правы. Я забыл показать, как данные были круглыми. – Samuel

Смежные вопросы