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

SQL Oracle Discussion :

Having sans Group by fonctionne mais le livre de l'exam dit non [11gR2]


Sujet :

SQL Oracle

  1. #1
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut Having sans Group by fonctionne mais le livre de l'exam dit non
    Bonjour,

    Dans le livre pour Oracle 12c "Oca Oracle Database 12c SQL Fundamentals I Exam Guide (Exam 1z0-xxx) de Roopesh Ramklass" il est écrit qu'un filtre Having ne peut pas avoir lieu sans un Group by au préalable; c'est même répété 3 à 4 fois.
    Sur la 11g ça marche sans problème pourtant donc est-ce que c'est une régression de la 12c ou une erreur malheureuse du livre?

    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
    SQL> desc employees
     Name                                      Null?    Type
     ----------------------------------------- -------- ---------------------
     
     EMPLOYEE_ID                               NOT NULL NUMBER(6)
     FIRST_NAME                                         VARCHAR2(20)
     LAST_NAME                                 NOT NULL VARCHAR2(25)
     EMAIL                                     NOT NULL VARCHAR2(25)
     PHONE_NUMBER                                       VARCHAR2(20)
     HIRE_DATE                                 NOT NULL DATE
     JOB_ID                                    NOT NULL VARCHAR2(10)
     SALARY                                             NUMBER(8,2)
     COMMISSION_PCT                                     NUMBER(2,2)
     MANAGER_ID                                         NUMBER(6)
     DEPARTMENT_ID                                      NUMBER(4)
     
    SQL> select sum(salary) from employees having sum(salary) > 1000000;
     
    no rows selected
     
    SQL> select sum(salary) from employees having sum(salary) < 1000000;
     
    SUM(SALARY)
    -----------
         691416
     
    SQL>
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Bienvenu dans le monde des livres de certification, plus ou moins truffés d'erreurs (voir les critiques sur amazon.COM).

    C'est plus qu'une erreur malheureuse du livre, c'est une erreur grossière, étonnante de la part d'un certifié OCM.
    Les fonctions d'agrégation n'exigeant pas de regroupement explicite (elles s'appliquent alors à l'ensemble des lignes répondant à l'éventuelle clause WHERE), rien ne s'oppose à faire porter une condition sur ce groupe global à l'aide de la clause HAVING.

    Et que dites-vous de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * 
    from scott.emp 
    where deptno=30
    having 1<>2;

    Il ne vous reste plus qu'à enrichir l'errata :
    http://www.mhprofessional.com/downlo...0071820288.txt
    et / ou écrire à l'auteur :
    http://community.oraclepressbooks.co...=129&email=yes
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  3. #3
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Merci à toi Pomalaix, ta réponse fait peur mais bon, j'ai pas le choix, je suis obligé d'utiliser ces livres pour tester mon niveau.

    J'ai testé ta commande; sympa :-)
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    La requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select sum(salary) from employees having sum(salary) < 1000000;
    deviens en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select sum(salary) 
      from hr.employees 
    group by ()
    having sum(salary) < 1000000
    c'est pour cela que vous pouvez écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select sum(salary) from employees
    La requête proposé par Pomalaix est une erreur certainement! Mais essayez de jouer avec un peu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
      from emp
    having deptno = 30
    ou similaire.

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    A la première lecture, j'ai cru que le GROUP BY () n'était qu'un pseudo-code illustratif, mais je découvre en testant que ça fonctionne !

    Mnitu, pourquoi dis-tu que ma requête est une erreur ? L'as-tu testée ?
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  6. #6
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Pomalaix, j'avais testé ta requête et Oracle ne renvoyait pas d'erreur.

    Mnitu, la requête plante mais je pense que c'était voulu, non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> select * from employees having department_id = 30;
    select * from employees having department_id = 30
                                   *
    ERROR at line 1:
    ORA-00979: not a GROUP BY expression
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    ...
    Mnitu, pourquoi dis-tu que ma requête est une erreur ? L'as-tu testée ?
    Oui, je me suis mal exprimé! L'erreur pour moi c'est que la requête fonctionne!

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

Discussions similaires

  1. [WS 2008 R2] GPO ajout groupe admin fonctionne sur win7 mais pas sur winxp
    Par devlopassion dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 01/03/2016, 15h09
  2. [AJAX] onChange fonctionne mais sans code source ?
    Par salyiohh dans le forum AJAX
    Réponses: 2
    Dernier message: 07/03/2015, 15h34
  3. Réponses: 2
    Dernier message: 12/11/2010, 09h39
  4. Réponses: 4
    Dernier message: 12/08/2010, 14h45
  5. Pb de COUNT et GROUP BY simple mais sans requête imbriquées
    Par vanquish dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/10/2004, 09h45

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