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 :

Requête SQL récursive dans la clause WHERE


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Novembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 139
    Par défaut Requête SQL récursive dans la clause WHERE
    Bonjour,

    J ai une requette sql recursive qui s'execute correctement,
    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
    WITH tree (data, id) AS 
    		(SELECT NO_APPEL, C_TYPEPB_PERE
    		 FROM TYPEPB TPB 
    		 INNER JOIN APPEL AP 
    		 ON AP.C_TYPEPB=TPB.C_TYPEPB
    		  AND AP.C_NATURE='RAISON' 
    		  WHERE TPB.C_TYPEPB = 362 
    		  UNION ALL SELECT NO_APPEL, C_TYPEPB_PERE 
    		  FROM TYPEPB TPB 
    		  INNER JOIN APPEL AP 
    		  ON AP.C_TYPEPB=TPB.C_TYPEPB 
    		  AND AP.C_NATURE='RAISON' 
    		  INNER JOIN tree t ON t.id = TPB.C_TYPEPB ) 
     
    		  SELECT data FROM tree WHERE data IS NOT NULL
    cette requette retourne des valeurs differents de colonne no_appel.

    J ai besoin d'injecter cette requette comme restriction dans la clause where d'une autre requette.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from X where no_appel in data(data est l'ensemble des valeurs retournés par la première requette)

    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    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
     
    WITH tree (DATA) AS 
    		(SELECT NO_APPEL
    		 FROM TYPEPB TPB 
    		 INNER JOIN APPEL AP 
    		 ON AP.C_TYPEPB=TPB.C_TYPEPB
    		  AND AP.C_NATURE='RAISON' 
    		  WHERE TPB.C_TYPEPB = 362 
    		  UNION ALL SELECT NO_APPEL
    		  FROM TYPEPB TPB 
    		  INNER JOIN APPEL AP 
    		  ON AP.C_TYPEPB=TPB.C_TYPEPB 
    		  AND AP.C_NATURE='RAISON' 
    		  INNER JOIN tree t ON t.id = TPB.C_TYPEPB ) 
     
    		  SELECT * FROM X WHERE no_appel IN (SELECT DATA FROM tree)
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Membre très actif
    Inscrit en
    Novembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 139
    Par défaut
    Bonjour,

    merci pour ta réponse, mais c'est pas que j ai demandé

    je veux inclure le code ci-dessous dans une clause where d'une autre requette,merger les deux requette dans une seule requette de cette façon

    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
     
    SELECT * FROM X WHERE no_appel IN(
    WITH tree (DATA) AS 
    		(SELECT NO_APPEL
    		 FROM TYPEPB TPB 
    		 INNER JOIN APPEL AP 
    		 ON AP.C_TYPEPB=TPB.C_TYPEPB
    		  AND AP.C_NATURE='RAISON' 
    		  WHERE TPB.C_TYPEPB = 362 
    		  UNION ALL SELECT NO_APPEL
    		  FROM TYPEPB TPB 
    		  INNER JOIN APPEL AP 
    		  ON AP.C_TYPEPB=TPB.C_TYPEPB 
    		  AND AP.C_NATURE='RAISON' 
    		  INNER JOIN tree t ON t.id = TPB.C_TYPEPB ) )

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Dès lors que vous utilisez une CTE, votre requête doit commencer par WITH.

    Si vous voulez l'inclure dans une autre requête il faut faire comme vous l'a conseillé zinzineti.

  5. #5
    Membre très actif
    Inscrit en
    Novembre 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 139
    Par défaut
    est ce que on peut utiliser la partie with....comme table et on lance un ordre select comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select *
    from (WITH tree (DATA) AS 
    		(SELECT NO_APPEL
    		 FROM TYPEPB TPB 
    		 INNER JOIN APPEL AP 
    		 ON AP.C_TYPEPB=TPB.C_TYPEPB
    		  AND AP.C_NATURE='RAISON' 
    		  WHERE TPB.C_TYPEPB = 362 
    		  UNION ALL SELECT NO_APPEL
    		  FROM TYPEPB TPB 
    		  INNER JOIN APPEL AP 
    		  ON AP.C_TYPEPB=TPB.C_TYPEPB 
    		  AND AP.C_NATURE='RAISON' 
    		  INNER JOIN tree t ON t.id = TPB.C_TYPEPB )) TAB

  6. #6
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Par défaut
    Bonjour,

    Quelque chose comme cela répond il à votre besoin ?
    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
    WITH tree (DATA, id) AS 
    		(SELECT NO_APPEL, C_TYPEPB_PERE
    		 FROM TYPEPB TPB 
    		 INNER JOIN APPEL AP 
    		 ON AP.C_TYPEPB=TPB.C_TYPEPB
    		  AND AP.C_NATURE='RAISON' 
    		  WHERE TPB.C_TYPEPB = 362 
    		  UNION ALL SELECT NO_APPEL, C_TYPEPB_PERE 
    		  FROM TYPEPB TPB 
    		  INNER JOIN APPEL AP 
    		  ON AP.C_TYPEPB=TPB.C_TYPEPB 
    		  AND AP.C_NATURE='RAISON' 
    		  INNER JOIN tree t ON t.id = TPB.C_TYPEPB ) 
    SELECT X.*
    FROM X
    INNER JOIN tree ON X.no_appel = tree.DATA
    WHERE DATA IS NOT NULL

Discussions similaires

  1. Utiliser un alias de colonne dans une clause Where MS SQL
    Par sir dragorn dans le forum Langage SQL
    Réponses: 11
    Dernier message: 12/10/2011, 09h31
  2. Réponses: 1
    Dernier message: 04/02/2011, 09h18
  3. Requêtes avec condition dans la clause where
    Par desmo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 25/02/2008, 13h36
  4. Réponses: 3
    Dernier message: 18/09/2006, 20h55
  5. Requête sql dans une clause Where
    Par PrinceMaster77 dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/07/2006, 11h30

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