2009-10-21 10 views
4

Il existe un problème qui ne sait pas résoudre uniquement avec SQL (je pourrais le faire avec PL/SQL, mais cela ne devrait être possible qu'avec SQL).Traitement des données circulaires dans Oracle SQL

J'ai une table (en fait, il n'est pas une table mais le résultat d'une avec requête) avec contient deux valeurs comme ceci:

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

Le ouput que je veux pour que les données seraient (je don « soins t de l'ordre):

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

en d'autres termes, je veux obtenir des ensembles disjoints de données reliées par l'une des deux valeurs.

Chaque paire dans la table d'entrée est unique (la valeur mineure est toujours à gauche, et j'ai utilisé un distinct pour calculer la table d'entrée).

Je n'ai absolument aucune idée sur la façon de le faire avec le modèle, et mes efforts avec connecter en se plaignant de "données circulaires". Au début, cela ne semble pas difficile à faire, mais ne peut pas comprendre comment le faire d'une manière non procédurale. Des pensées?

Merci d'avance.

Répondre

4

La requête suivante travaillera avec votre ensemble de données:

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 

J'utilise Tom Kyte's concatenation stragg fonction.

+0

Comme SeriousCallersOnly pointé, je n'ai pas réussi à montrer comment les données pourraient être circulaires. J'ai ajouté un nocycle à la connexion, et la requête semble fonctionner correctement. Merci beaucoup Vincent. J'ai beaucoup appris. – Samuel

3

Tout d'abord, je vérifierais vos données. L'exemple de données que vous avez fourni ne semble pas circulaire et se connecter par ne devrait pas erreur.

Si vos données sont comme suit alors ce serait erreur:

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

Dans Oracle 10g, vous pouvez spécifier NOCYCLE pour Oracle pour retourner les lignes, même si une CONNECT BY LOOP existe.

+2

Vous avez complètement raison. J'ai oublié de montrer comment les données étaient circulaires. – Samuel

Questions connexes