Maison > Article > base de données > Comment convertir plusieurs lignes en une seule dans Oracle
Dans Oracle, vous pouvez utiliser la fonction listagg avec la clause "order by" pour convertir plusieurs lignes en une seule ligne. Cette instruction peut trier les données, puis regrouper les résultats triés. La syntaxe est "listagg (nom de la colonne,'). séparateur ') au sein du groupe (ordre par nom de colonne)".
L'environnement d'exploitation de ce tutoriel : système Windows 10, version Oracle 11g, ordinateur Dell G3.
En raison du besoin, les sous-organisations de l'organisation obtenue doivent être combinées en une seule ligne de données, et la propre fonction d'Oracle est utilisée
listagg (nom de la colonne , 'séparateur') au sein du groupe (ordre par nom de colonne)
C'est-à-dire qu'au sein de chaque groupe, LISTAGG trie les colonnes selon l'ordre par clause et assemble les résultats triés ensemble
Ma structure organisationnelle est une structure arborescente, et le SQL suivant consiste à interroger les noms de tous les sous-départements du département actuel.
SELECT LISTAGG(O.ORGNAME,',') WITHIN GROUP(ORDER BY LEVEL) FROM ORGANIZATION O START WITH O.ORGID = 1000 CONNECT BY PRIOR O.ORGID = O.PID AND LEVEL<4
Remarque : Le SQL ci-dessus utilise le mot-clé Oracle LEVEL, qui indique à quel niveau se trouvent les données dans la structure arborescente
Le SQL ci-dessus utilise également l'instruction de requête d'arborescence Oracle START WITH… CONNECT BY PRIOR…
Si les requêtes sont toutes les nœuds parents du nœud, alors le START WITH SQL ci-dessus doit être remplacé par :START WITH O.ORGID = 1000 CONNECT BY PRIOR O.PID = O.ORGID
(Les champs après PRIOR ne sont pas les mêmes que l'ordre précédent)
Les données de la table ORGANIZATION sont les suivantes
ORGID | ORGNAME | PID |
---|---|---|
1000 | École primaire | 0 |
1100 | Première année | 1000 |
1200 | Second année | 1000 |
1101 | Classe 101 | 1100 |
1102 | Classe 102 | 1100 |
1103 | Classe 103 | 1100 |
1201 | Classe 201 | 1200 |
1.LEVEL
SELECT ORGNAME,LEVEL FROM ORGANIZATION START WITH ORGID = 1000 CONNECT BY PRIOR O.ORGID = O.PID
Les résultats d'exécution sont les suivants
ORGNAME | LEVEL |
---|---|
Elementary School | 1 |
First Grade | 2 |
Deuxième année | 2 |
Classe 101 | 3 |
Classe 102 | 3 |
Classe 103 | 3 |
Classe 201 | 3 |
2. LISTAGG... AU SEIN DU GROUPE...
SELECT LISTAGG(O.ORGNAME,',') WITHIN GROUP(ORDER BY LEVEL) FROM ORGANIZATION O
Les résultats de l'exécution sont les suivants :
École primaire, première année, deuxième année, classe 101, classe 102, classe 103, classe 201
3 Mettez tous les nœuds enfants sous le nœud parent sur une seule ligne
SELECT LISTAGG(O.ORGNAME,',') WITHIN GROUP(ORDER BY LEVEL) FROM ORGANIZATION O START WITH O.ORGID = 1000 CONNECT BY PRIOR O.ORGID = O.PID AND LEVEL<4
L'exécution. les résultats sont les suivants :
École primaire, première année, deuxième année, classe 101, classe 102, classe 103, classe 201
Tutoriel recommandé : "Tutoriel vidéo Oracle"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!