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

Langage SQL Discussion :

colonne définie par une requête imbriquée


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut colonne définie par une requête imbriquée
    Bonjour,
    j'ai un petit détail sur une requête sous Oracle 8i,
    voici le code :
    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 A.IND_NAVS
     
     (select count(*) as count_200
              from aff_rubriques B
    	 where B.AFF_NAFF = A.AFF_NAFF  and
                   B.RUB_NRUB  = 200        and
                   B.RAF_DDAF <= A.PEE_PFIN and 
                  (B.RAF_DFAF >= A.PEE_PDEB or 
                   B.RAF_DFAF is null))  cnt_200
     
           FROM DEC_EMP_AVS A
           WHERE  A.DRA_ADEC = 2004 and
                      cnt_200 <> 1
    Ma question est : la colonne cnt_200 n'est pas reconnue(idem pour count_200), je peux résoudre le problème en répétant le code de la requête imbriquée mais est-ce la meilleure solution ?
    Merci d'avance pour vos suggestions.

  2. #2
    Membre habitué Avatar de Original Prankster
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 226
    Points : 192
    Points
    192
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A.IND_NAVS, (select count(*)
                        from aff_rubriques B
                        where B.AFF_NAFF = A.AFF_NAFF
                        and B.RUB_NRUB  = 200
                        and B.RAF_DDAF <= A.PEE_PFIN
                        and (B.RAF_DFAF >= A.PEE_PDEB or B.RAF_DFAF is null)) as cnt_200     
    FROM DEC_EMP_AVS A
    WHERE  A.DRA_ADEC = 2004
    AND cnt_200 <> 1
    Comme ça, ca marche pas ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 113
    Points
    113
    Par défaut
    Tu peux jeter un oeil sur http://sqlpro.developpez.com/cours/sqlaz/ensembles/#L2 (clause having)

    Je ne sais pas si ca résoudra tous tes problèmes, mais au moins une bonne partie

  4. #4
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Original Prankster

    Comme ça, ca marche pas ?
    Désolé, c'est pas la virgule (que j'ai omis de mettre dans le post) ou les espaces le problème ! Merci quand même...

  5. #5
    Membre habitué Avatar de Original Prankster
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 226
    Points : 192
    Points
    192
    Par défaut
    Il faut voir si Oracle 8i gère les alias. Par ailleurs, il te manquait un AS, et tu avais un alias inutile. Je ne vois pas pkoi ca ne marcherait pas désormais.

  6. #6
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Original Prankster
    Il faut voir si Oracle 8i gère les alias. Par ailleurs, il te manquait un AS, et tu avais un alias inutile. Je ne vois pas pkoi ca ne marcherait pas désormais.
    Bon, je met une requête qui marche :
    SELECT A.IND_NAVS,
    (select count(*) as count_200
    from aff_rubriques B
    where B.AFF_NAFF = A.AFF_NAFF and
    B.RUB_NRUB = 200 and
    B.RAF_DDAF <= A.PEE_PFIN and
    (B.RAF_DFAF >= A.PEE_PDEB or
    B.RAF_DFAF is null)) cnt_200

    FROM DEC_EMP_AVS A
    WHERE A.DRA_ADEC = 2004 and

    (select count(*) as count_200
    from aff_rubriques B
    where B.AFF_NAFF = A.AFF_NAFF and
    B.RUB_NRUB = 200 and
    B.RAF_DDAF <= A.PEE_PFIN and
    (B.RAF_DFAF >= A.PEE_PDEB or
    B.RAF_DFAF is null)) <> 1
    Voila, j'espere que vous comprendrez mieux mon problème.

  7. #7
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    Je passe en coup de vent, j'ai trouvé un exemple de code que tu pourrais peut-être adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT
    	Chp_Nofa,
    	Chp_Nume,
    	nvl(nblig.nb_lignes, 0) Nb_Lignes
    FROM
    	Chapitre,
    	(select lif_nofa, lif_chno, count(*) nb_lignes from tratlif group by lif_nofa, lif_chno) NbLig
    WHERE
    	Chp_Nofa = NbLig.lif_nofa (+)
    AND Chp_Nume = NbLig.lif_chno (+)
    AND NbLig.nb_lignes > 2
    En fait, ma sous-requête me donne une pseudo-table, sur laquelle je peux ensuite appliquer une condition dans ma clause WHERE.

  8. #8
    Membre habitué Avatar de Original Prankster
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 226
    Points : 192
    Points
    192
    Par défaut
    Citation Envoyé par lper
    Bon, je met une requête qui marche :
    J'avais bien compris. Et je répète que count_200 ne devrait pas être là, il est inutile.

    Enfin bon, tu as regardé du côté de HAVING ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A.IND_NAVS, (select count(*)
                        from aff_rubriques B
                        where B.AFF_NAFF = A.AFF_NAFF
                        and B.RUB_NRUB  = 200
                        and B.RAF_DDAF <= A.PEE_PFIN
                        and (B.RAF_DFAF >= A.PEE_PDEB or B.RAF_DFAF is null)) as cnt_200     
    FROM DEC_EMP_AVS A
    WHERE  A.DRA_ADEC = 2004
    GROUP BY A.IND_NAVS, cnt_200 HAVING cnt_200 <> 1

  9. #9
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Original Prankster
    Enfin bon, tu as regardé du côté de HAVING ?
    J'ai testé ton exemple, impossible déja de mettre cnt_200 dans le group by ni dans le having, merci pour tes suppositions....

    Citation Envoyé par Xo
    En fait, ma sous-requête me donne une pseudo-table, sur laquelle je peux ensuite appliquer une condition dans ma clause WHERE.
    C'est ce que j'avais fait au début, le problème est que le lien sur cette pseudo-table est optionnel avec un opérateur différent du '=' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    B.RAF_DDAF [u][b]<=[/b][/u] A.PEE_PFIN and 
    (B.RAF_DFAF [u][b]>=[/b][/u] A.PEE_PDEB or 
    B.RAF_DFAF is null))
    Et on ne peut mettre le + que sur un lien avec '='....

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Teste cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT IND_NAVS, cnt_200
    FROM   (SELECT A.IND_NAVS          
                   (SELECT COUNT(*) 
                    FROM   aff_rubriques B
                    WHERE  A.AFF_NAFF = B.AFF_NAFF
                      AND  B.RUB_NRUB  = 200        
                      AND  B.RAF_DDAF <= A.PEE_PFIN 
                      AND (B.RAF_DFAF >= A.PEE_PDEB 
                           OR B.RAF_DFAF is null))  cnt_200
            FROM   DEC_EMP_AVS A
            WHERE  A.DRA_ADEC = 2004° T
    WHERE   cnt_200 <> 1
    C'est ta requête initiale réécrite !

    A +

  11. #11
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 398
    Points : 641
    Points
    641
    Par défaut
    Merci beaucoup Frédéric, c'est bien le résultat que j'attendais.
    Je me permet juste de faire une petite correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT IND_NAVS, cnt_200 
    FROM   (SELECT A.IND_NAVS ,         
                   (SELECT COUNT(*) 
                    FROM   aff_rubriques B 
                    WHERE  A.AFF_NAFF = B.AFF_NAFF 
                      AND  B.RUB_NRUB  = 200        
                      AND  B.RAF_DDAF <= A.PEE_PFIN 
                      AND (B.RAF_DFAF >= A.PEE_PDEB 
                           OR B.RAF_DFAF is null))  cnt_200 
            FROM   DEC_EMP_AVS A 
            WHERE  A.DRA_ADEC = 2004 and aff_naff = 4122)
    WHERE   cnt_200 <> 1

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Select sur nom de colonne récupéré par une requête
    Par epistole dans le forum Développement
    Réponses: 4
    Dernier message: 26/04/2013, 17h22
  2. Réponses: 4
    Dernier message: 21/02/2008, 22h35
  3. [HQL] Nombre de colonnes retourné par une requête
    Par Fr@ncky dans le forum Hibernate
    Réponses: 4
    Dernier message: 13/07/2007, 13h47
  4. Réponses: 10
    Dernier message: 02/02/2007, 00h02
  5. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29

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