3 votes

Requête SQL récursive : une entrée pointant vers une autre, et la traversant

Je suis en train d'essayer d'écrire une requête SQL (pour SQL Server), et je me demande s'il existe une méthode simple pour atteindre mes objectifs. Je vais simplifier les choses pour aller droit au but :

J'ai une table avec deux colonnes, que nous pouvons appeler colonne A et colonne B. La colonne A contient le nom d'un fichier segmenté, et la colonne B contient la partie suivante du fichier segmenté. Ainsi, je peux avoir plusieurs segments pointant vers plusieurs segments.

Par exemple :

Colonne A     Colonne B
Fichier 1     Fichier 2
Fichier 2     Fichier 3
Fichier 3     Fichier 4
Fichier 7     Fichier 13

J'ai besoin d'obtenir une liste de tous les segments commençant par Fichier 1 et se terminant par Fichier 4, de préférence dans une seule colonne. Ou, pour le dire autrement, je dois commencer par une entrée donnée dans la colonne A, et avoir quelque chose qui traverse et déréférence les entrées de la colonne B, jusqu'à ce qu'aucune entrée ne puisse être trouvée de la colonne B dans la colonne A.

Quelque chose comme SELECT allsegments() From FTable WHERE FTable.A = "Fichier 1"? Ou pensez-vous que je doive écrire un code personnalisé?

2voto

Mikael Eriksson Points 77190

À l'aide d'un CTE récursif, cela peut ressembler à ceci :

declare @T table
(
  ColumnA varchar(10),
  ColumnB varchar(10)
);

insert into @T values  
('File 1',       'File 2'),
('File 2',       'File 3'),
('File 3',       'File 4'),
('File 7',       'File 13');

with C as
(
  select T.ColumnA,
         T.ColumnB,
         cast(T.ColumnA+','+T.ColumnB as varchar(max)) as Comb
  from @T as T
  where T.ColumnA = 'File 1'
  union all
  select T.ColumnA,
         T.ColumnB,
         C.Comb+','+T.ColumnB 
  from @T as T
    inner join C
      on T.ColumnA = C.ColumnB
)
select top 1 Comb
from C
order by len(Comb) desc
option (maxrecursion 0)

Résultat :

Comb
------------------------
File 1,File 2,File 3,File 4

Par défaut, maxrecursion est de 100, donc si vous avez plus de 100 fichiers en chaîne, vous devez spécifier le nombre de récursions autorisées. option (maxrecursion 0) rend le nombre maximal illimité.

0voto

sélectionnez chemin de 
(
   sélectionner connect_by_isleaf feuille, sys_connect_by_path(von, '/') chemin
     de table1
    commencer avec A = 'Fichier x'
  connect by   A = prior B
) où chemin like '%Fichier y';

\=> Cette requête renvoie les chemins possibles de Fichier x à Fichier y, séparés par / ou n'importe quel délimiteur de votre choix.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X