2011-04-18 4 views
4

J'ai besoin d'écrire une requête qui appelle une requête récursive plusieurs fois.Comment utiliser une requête récursive en tant que sous-requête?

Je n'étais pas capable de comprendre comment faire. Je suppose que je peux le faire en utilisant un curseur, en préparant l'instruction sql à l'exécution, puis en utilisant EXEC (mySQLstatement) pour l'exécuter à chaque curseur FETCH NEXT.

De toute façon ce n'est pas la bonne approche.

C'est le problème (bien sûr ici il est simplifié et je ne laisse que les colonnes nécessaires pour m'exprimer): J'ai un arbre de clients (une hiérarchie) et pour chaque client il y a des contacts définis.

La table CUSTOMERS contient un champ ID_CUSTOMER et un champ ID_PARENT_CUSTOMER la table CUSTOMER_CONTACTS contient un champ ID_CUSTOMER et un champ ID_CONTACT.

Avec cette requête (cela fonctionne) je suis en mesure d'obtenir tous les contacts pour le client 308 et tous les contacts pour ses sous-clients:

with [CTE] as (
    select ID_CUSTOMER from CUSTOMERS c where c.ID_CUSTOMER = 308 
    union all 
    select c.ID_CUSTOMER from [CTE] p, CUSTOMERS c 
     where c.ID_PARENT_CUSTOMER = p.ID_CUSTOMER 
) 
select ID_CUSTOMER into #Customer308AndSubCustomers from [CTE] 

select 308 as ParentCustomer, ID_CUSTOMER, ID_CONTACT, from CUSTOMER_CONTACTS 
WHERE ID_CUSTOMER IN (select * from #Customer308AndSubCustomers) 
drop table #Customer308AndSubCustomers 

Mais je voudrais avoir dans une seule requête la même pour TOUS LES CLIENTS, pas seulement pour 308. Voilà pourquoi je suggérais d'utiliser un curseur pour que je puisse réutiliser l'instruction ci-dessus et utiliser une variable au lieu de 308.

Mais pouvez-vous suggérer une meilleure requête?

Répondre

6

supprimer Juste la condition de filtrage de la pièce d'ancrage:

WITH q AS 
     (
     SELECT ID_CUSTOMER, ID_CUSTOMER AS root_customer 
     FROM CUSTOMERS c 
     UNION ALL 
     SELECT c.ID_CUSTOMER, q.root_customer 
     FROM q 
     JOIN CUSTOMERS c 
     ON  c.ID_PARENT_CUSTOMER = q.ID_CUSTOMER 
     ) 
SELECT * 
FROM q 

root_customer vous montrera la racine de la chaîne.

Notez que les mêmes clients peuvent être retournés plusieurs fois. Dites, un petit-enfant sera de retour au moins trois fois: dans son arbre grand-parent, son arbre parent et dans son propre arbre, mais chaque fois avec un root_customer différent.

+0

oui oui oui oui oui! C'est le premier jour pour moi avec des requêtes récursives, je ne suis pas encore dedans. Merci beaucoup, cela a résolu mon problème! – LaBracca

Questions connexes