En sqlserver 2005,
On a (extrait de http://www.developpez.net/forums/d33411-2/bases-donnees/langage-sql/creation-faq-sql-voulez-participer/)
CREATETABLE Territoire (IdVendeur integer, Ville varchar(20))
INSERTINTO Territoire VALUES(1, 'Paris');
INSERTINTO Territoire VALUES(1, 'Lille');
INSERTINTO Territoire VALUES(1, 'Lyon');
INSERTINTO Territoire VALUES(1, 'Marseille');
INSERTINTO Territoire VALUES(1, 'Bordeaux');
INSERTINTO Territoire VALUES(2, 'Paris');
INSERTINTO Territoire VALUES(2, 'Lyon');
INSERTINTO Territoire VALUES(2, 'Brest');
INSERTINTO Territoire VALUES(3, 'Paris');
WITH px (idVendeur, Villes, Precedente, Niveau)AS
(SELECT IdVendeur, cast(Ville AS varchar(MAX)), cast (ville AS varchar(MAX)), 1
FROM Territoire a
WHERE Ville = (SELECT min(Ville)FROM Territoire b WHERE a.idVendeur = b.idVendeur)
union ALL
SELECT a.IdVendeur, px.Villes + ';' + a.ville, cast(a.Ville AS varchar(max)), Niveau + 1
FROM Territoire a INNERJOIN px ON a.idVendeur = px.idVendeur AND a.Ville > px.Precedente
)
SELECT IdVendeur, Villes
FROM px a
WHERE Niveau = (SELECT max(Niveau)FROM px b WHERE a.idVendeur = b.idVendeur)
C'est ce qui s'appele une CTE common table expression
requete recursive
avec une procedure stockée ou par du code.
il est possible de faire le meme résultat
Je mets l'exemple au cas où un autre membre cherche la même chose mais sur SQL SERVEUR
Bon coding