IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

erreur mssql sur requete recussive


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 93
    Points : 65
    Points
    65
    Par défaut erreur mssql sur requete recussive
    Bonjour,
    j'essaie une requete récurssive en sql, malheureusement j'ai un message
    d'erreur que je n'arrive pas à me débarrasser.

    Voici la requete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    WITH MaRecussiveReq(NUMCONTRAT, IDCONTRAT, IDCLIENT, IDMAISONMERE, IDANNEXECONTRAT, Level)
    AS
    (   
       SELECT C.NUMCONTRAT, 
       	      C.IDCONTRAT, 
       	      CLI.IDCLIENT,
    	      CLI.IDMAISONMERE,
    	      A.IDANNEXECONTRAT,
    	      0 AS Level
     
       FROM maBdd1..CLIENT CLI
     
       LEFT JOIN maBdd1..CONTRAT C
           ON CLI.IDCLIENT = C.IDCLIENT
     
       LEFT JOIN maBdd1..ANNEXECONTRAT A
            ON C.IDCONTRAT = A.IDCONTRAT
     
       UNION ALL
     
       SELECT C.NUMCONTRAT, 
       	  C.IDCONTRAT, 
       	  CLI.IDCLIENT,
              CLI.IDMAISONMERE,
              A.IDANNEXECONTRAT,
              Level + 1
     
       FROM maBdd1..CLIENT CLI
     
       LEFT JOIN maBdd1..CONTRAT C
            ON CLI.IDCLIENT = C.IDCLIENT
     
       LEFT JOIN maBdd1..ANNEXECONTRAT A
            ON C.IDCONTRAT = A.IDCONTRAT
     
       LEFT JOIN MaRecussiveReq AS CEV
    		ON CLI.IDMAISONMERE = CEV.IDCLIENT
     
    )
    --------------------------------------------------------------------
     
    SELECT NUMCONTRAT, IDCONTRAT, IDCLIENT, IDMAISONMERE, IDANNEXECONTRAT, Level
    FROM MaRecussiveReq
    LEFT JOIN mabdd1..CLIENT C
          ON C.IDCLIENT = MaRecussiveReq.IDMAISONMERE
     
    OPTION (MAXRECURSION 4)
    Et Le message d'erreur:

    La jointure externe n'est pas autorisée dans la partie récursive d'une expression de table commune récursive 'MaRecussiveReq'.

    Quelqu'un pourrait il m'aider svp?

    Merci bien.

  2. #2
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    Vous ne pouvez pas utiliser de jointure externe pour lier la seconde partie de votre cte au point d'ancrage. Mais j'ai l'impression que vous pouvez remplacer tous les LEFT JOIN par des JOIN car un contrat est toujours pour un client, etc, ...

    Il ne manque pas une condition CLI.IDMaisonMere IS NULL dans le/les points d'ancrage(s) ?

    @+

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Glop
    Ton but est-il de trouver:
    à partir d'un maison mère tous les contrats en dépendant
    ou bien
    remonter à partir de contrats vers les maisons mères
    ?

    Dans le premiers cas, tu dois faire dans ta première partie une restriction de tes données de départ (soit par un where du genre "IDMAISONMERE is null", voire si tu as une table de relations père-fils une première CTE avec un joli EXCEPT* - très efficace ! ) puis chercher à descendre vers les contrats "contenus".
    Le second cas me semble moins désirable (car il nécessite de caractériser quels sont les contrats à sélectionner au départ - toujours cette idée de jeu de données restreint et fini pour commencer - ), mais si c'est le cas, ben on verra pour t'aiguiller davantage ^^

    *: Voilà très sommairement l'idée que je suggère avec le Except
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    with
      cte (ids)
        as (
            Select id_parents from matable
         EXCEPT
            select id_enfants from matable
        ),
      RecursQuery( ... )
      as (
          Select ...
          From cte
           Inner Join infos
      union all
         Select ...
         From RecursQuery
          Inner join infos
            on (ancrage  à définir)
      )
      Select ...
      From ...
      Where ...

Discussions similaires

  1. [XL-2007] Erreur VBA sur requete SQL
    Par guigui69 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/08/2013, 08h44
  2. [AC-2010] Erreur Overflow sur requete
    Par Tytelle dans le forum VBA Access
    Réponses: 3
    Dernier message: 23/04/2012, 12h48
  3. Erreur 3061 sur requete SQL
    Par FtF Nemesis dans le forum VBA Access
    Réponses: 1
    Dernier message: 24/03/2011, 09h15
  4. [MySQL] message erreur indésirable sur requete mySQL
    Par kuja2053 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 26/07/2007, 02h42
  5. [SQL] Erreur repetitive sur requete SQL (Count et Sum)
    Par hools dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2007, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo