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

MS SQL Server Discussion :

clause WHERE sur CTE


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut clause WHERE sur CTE
    Avec les CTE sous SQL server 2005 on est censés pouvoir faire beaucoup de choses, mais quand je veux que les critères de départ soient filtrés avec une CTE récursive par exemple celle ci
    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 RPL (PART, SUBPART, QTE) 
    AS 
       ( 
        SELECT RT.PART, RT.SUBPART, CAST(RT.QTE AS DECIMAL(15,4))
           FROM View_1 RT 
           WHERE RT.PART = 251180
        UNION ALL 
          SELECT PARENT.PART, CHILD.SUBPART, CAST((ISNULL(PARENT.QTE,0) * ISNULL(CHILD.QTE,0)) AS DECIMAL(15,4))
           FROM RPL PARENT,  View_1 CHILD WHERE (PARENT.SUBPART = CHILD.PART) 
       ) 
     
    SELECT SUM(R.QTE), T.DPT_FAMILLE, T.DPT_SFAMILLE, T.DPT_LIBELLE, T.DPT_PUA1 
    FROM RPL R INNER JOIN T_DEVPART_DPT T ON (R.SUBPART = T.DPT_ID)
    WHERE T.DPT_STYPE = 4 AND R.QTE <> 0
    GROUP BY T.DPT_FAMILLE, T.DPT_SFAMILLE, T.DPT_LIBELLE , T.DPT_PUA1
    Comment faire pour remplacer le
    WHERE RT.PART = 251180
    en dur, par des critères , de la même manière qu'une vue.
    Je peux bien sur placer cette CTE dans une PS avec paramètres, mais
    comment faire sans PS, en pur SQL
    Bruno Petit

  2. #2
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut
    Oui pas clair tout cela
    ce que je veux dire c'est comment pour une cte de ce type faire
    comme avec une vue classique cad,
    - la vue renseigne la structure générale de la requète en quelque sorte sur l'ensemble des données des tables concernées
    - au moment de l'utiliser avec
    Select * From LaVue Where ....
    Bruno Petit

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je ne suis pas sûr d'avoir bien compris ce que tu souhaites mettre en oeuvre.

    Tu peux effectivement utiliser une CTE dans une procédure:

    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
     
    CREATE PROCEDURE spRPL
    	@TYPE INT, 
    	@PART INT
    AS
    BEGIN
    	WITH RPL (PART, SUBPART, QTE) 
    	AS 
    	   ( 
    	    SELECT RT.PART, RT.SUBPART, CAST(RT.QTE AS DECIMAL(15,4))
    			FROM View_1 RT 
    			WHERE RT.PART = @PART
    	    UNION ALL 
    			SELECT PARENT.PART, CHILD.SUBPART, CAST((ISNULL(PARENT.QTE,0) * ISNULL(CHILD.QTE,0)) AS DECIMAL(15,4))
    				FROM RPL PARENT,  View_1 CHILD
    				WHERE (PARENT.SUBPART = CHILD.PART) 
    	   ) 	 
    	SELECT SUM(R.QTE), T.DPT_FAMILLE, T.DPT_SFAMILLE, T.DPT_LIBELLE, T.DPT_PUA1 
    	FROM RPL R
    	INNER JOIN T_DEVPART_DPT T ON (R.SUBPART = T.DPT_ID)
    	WHERE T.DPT_STYPE = @TYPE AND R.QTE <> 0
    	GROUP BY T.DPT_FAMILLE, T.DPT_SFAMILLE, T.DPT_LIBELLE , T.DPT_PUA1
    END
    Sinon en SQL "pur" comme tu dis, à part:

    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
     
    DECLARE @TYPE INT; SET @TYPE = 251180;
    DECLARE @PART INT; SET @PART = 4;
     
    WITH RPL (PART, SUBPART, QTE) 
    AS 
       ( 
    	SELECT RT.PART, RT.SUBPART, CAST(RT.QTE AS DECIMAL(15,4))
    	   FROM View_1 RT 
    	   WHERE RT.PART = @PART
    	UNION ALL 
    	  SELECT PARENT.PART, CHILD.SUBPART, CAST((ISNULL(PARENT.QTE,0) * ISNULL(CHILD.QTE,0)) AS DECIMAL(15,4))
    	   FROM RPL PARENT,  View_1 CHILD WHERE (PARENT.SUBPART = CHILD.PART) 
       ) 
     
    SELECT SUM(R.QTE), T.DPT_FAMILLE, T.DPT_SFAMILLE, T.DPT_LIBELLE, T.DPT_PUA1 
    FROM RPL R INNER JOIN T_DEVPART_DPT T ON (R.SUBPART = T.DPT_ID)
    WHERE T.DPT_STYPE = @TYPE AND R.QTE <> 0
    GROUP BY T.DPT_FAMILLE, T.DPT_SFAMILLE, T.DPT_LIBELLE , T.DPT_PUA1;
    C'est un peu brut, mais ça a le mérite de fonctionner

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Points : 74
    Points
    74
    Par défaut
    Oui je sais je ne suis pas très clair, je débute en SQL
    j'ai bien compris que l'on peut utiliser une cte dans une procedure stockée,
    moi je voulais créer une vue avec cette CTE; celle ci construit la fermeture transitive d'une table hièrarchique... je veux pouvoir construire cette vue à partir de tout niveau dans ma table hièrarchique donc il faudrait disposer d'une vue paramètrable, mais cela ne semble pas exister avec SQL server 2005, je suis étonné que chaque fois que l'on veut qqc d'un peu dynamique il faille utiliser des ps, donc pour mon cas quasiment partout, mais bon si les ps sont l'équivalent fonctionnel des vues paramètrables dans SQL server tout va bien, je souhaitait juste utiliser une vue parce que je pensais que cela aidait à l'optimisation
    Bruno Petit

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Sous quel SGBD est-il possible de créer des vues paramétrables ? J'ai fait un peu d'Oracle, mais je ne me rappelle pas de choses comme ça.

    Pour créer une vue c'est pareil que sous Oracle, ça se fait avec un CREATE VIEW. Le statement est pareillement paramétrable, on peut par exemple créer une vue sur un jour d'une table qui enregistre plusieurs mois de données.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/04/2007, 09h07
  2. [MySQL] Clause WHERE sur une liste et jeu de caractère
    Par napz dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/10/2006, 13h03
  3. [DTS] Problème avec clause WHERE sur Date
    Par bibou dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 28/06/2006, 12h18
  4. [SQL] clause Where sur un booléen
    Par mosquitout dans le forum Access
    Réponses: 3
    Dernier message: 21/12/2005, 21h29
  5. Clause Where sur une Date
    Par Zebulonn dans le forum Installation
    Réponses: 31
    Dernier message: 20/10/2005, 11h56

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