CTE SQL Server

CTE SQL Server - SQL/NoSQL - Programmation

Marsh Posté le 16-01-2012 à 18:02:07    

Hi all,
voici une problématique sur une requete récusive.
Schéma :  
  * des noeuds à niveaux potentiellement infini
  * des feuilles (de type feuille) et qui ont une qualification (un pays).
 
Je veux afficher les arbres complets (le tableau qui représente l'arbre ...) mais seulement pour les arbre qui ont au mois une feuille dans le Pays désiré.
Pour la faire simple le code suivant est utilisé actuellement : Elle part du bas (test de la feuille) pour remonter vers le haut (d'ou le distinct) mais je suis pas sur que ca soit OK la requete tourne en rond car performance pas géniale.
 
Vous auriez une meilleure méthode ou des conseils sur la récursivité  ?
 
merci.
 

Code :
  1. WITH
  2.   cteReports (id, name, fatherId)
  3.   AS
  4.   (
  5.     SELECT acc.id, acc.name, acc.fatherId
  6.     FROM account acc
  7. where acc.type = 'Leaf' and acc.country = 'EXAMPLE'
  8.     UNION ALL
  9.     SELECT acc.id, acc.name, acc.fatherId
  10.     FROM account acc
  11.     INNER JOIN cteReports r
  12.  ON acc.Id = r.fatherId
  13. )
  14. SELECT distinct
  15.   name,
  16.   fatherId,
  17. FROM cteReports
  18. option (maxrecursion 0)


 

Reply

Marsh Posté le 16-01-2012 à 18:02:07   

Reply

Marsh Posté le 18-01-2012 à 08:57:49    

SQL n'est pas fait pour ce genre de requete, il y a moyen d'accelerer le traitement en utilisant d'autres facon de representer une hierarchie mais en general ce n'est simplement pas une bonne idée d'utiliser une represenation hierarchique dans un SGBD relationel.
 
Google est remplis de technique independante du SGBD.
Si tu as la bonne version de SQL tu peux aussi jetter un oeuil du coté du hierarchy_id.
 
Sinon soit bien sur que ta table ai un index sur acc.id et un autre sur acc.fatherId, chaque index doit couvrir au minimum la colonne acc.name, acc.id et acc.fatherId.
Un index sur acc.type et acc.country peut aussi aider.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed