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 :

Fonctions de groupe imbriquées : Problème! [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 Fonctions de groupe imbriquées : Problème!
    Bonjour tout le monde,

    J'ai un GROS GROS souci de compréhension sur comment fonctionnent les fonctions de groupe imbriquées.

    Voici mon jeu de test.

    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
    select min(bic_name), length(bic_name) from bic_code group by length(bic_name);
     
    MIN(BIC_NAME)                       LENGTH(BIC_NAME)
    ----------------------------------- ----------------
    AFL                                                3
    ADFA                                               4
    ACCOR                                              5
    360 AM                                             6
    ABENGOA                                            7
    AB VOLVO                                           8
    9 TELECOM                                          9
    2XIDEAS AG                                        10
    2CG LIMITED                                       11
    1818 GESTION                                      12
    123VENTURE SA                                     13
    2W / KALTCHUGA                                    14
    'BANK SGB' PJSC                                   15
    'INDUSTRIALBANK'                                  16
    'MOSTRANSBANK' AO                                 17
    1776 RIVERBANK LTD                                18
    1ST ENTERPRISE BANK                               19
    A-SEC OUTSOURCING AB                              20
    'BELAGROPROMBANK' JSC                             21
    'BANK RESPUBLIKA' OJSC                            22
    'BANK MOSCOW-MINSK' JSC                           23
     
    MIN(BIC_NAME)                       LENGTH(BIC_NAME)
    ----------------------------------- ----------------
    'VERHNEVOLZHSKIY' CB OAO                          24
    ''ANKOR BANK OF SAVINGS''                         25
    1607 CAPITAL PARTNERS, LLC                        26
    'RADABANK' JOINT STOCK BANK                       27
    1492 CAPITAL MANAGEMENT, LLC                      28
    'VOLZHSKY UNIVERSAL BANK' OAO                     29
    'LATVIJAS PRIVATBANKA' JOINT-S                    30
    'RUBLEVSKY' COMMERCIAL BANK OOO                   31
    'HIMIK' OPEN JOINT-STOCK COMPANY                  32
    A.C.C. STAFF CREDIT UNION LIMITED                 33
    1ST NATIONAL BANK ST.LUCIA LIMITED                34
    ''GARAGUM'' BANK INTERNATIONAL JOIN               35
     
     
    34 rows selected.
    Déjà, que je n'ai pas mis de Order by, et que la requête soit ordonnée sur le deuxième champ... je trouve ça bizarre bizarre mais bon, passons!

    Mais si je rajoute un Max, le résultat du champ BIC_NAME est AFL et c'est ça que je ne comprend pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select max(min(bic_name)) from bic_code group by length(bic_name);
     
    MAX(MIN(BIC_NAME))                 
    -----------------------------------
    AFL                                
    1 row selected.
    Donc, si je réfléchis, dans ma première liste, Oracle considère que AFL est le MAX parmi les MIN du champ Bic_name ?

    Je me dis qu'il y a peut-être un problème avec mes paramètres de tri genre NLS et donc je fais une deuxième requête avec un Order by. Et là c'est dingue car AFL n'est ni en premier ni en dernier... donc comment peut-il me le sélectionner avec une requête MAX?

    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
    select min(bic_name) from bic_code group by length(bic_name) order by min(bic_name);
    MIN(BIC_NAME)                      
    -----------------------------------
    AB VOLVO                           
    ABENGOA                            
    A.C.C. STAFF CREDIT UNION LIMITED  
    ACCOR                              
    ADFA                               
    AFL                                
    ''ANKOR BANK OF SAVINGS''          
    A-SEC OUTSOURCING AB               
    'BANK MOSCOW-MINSK' JSC            
    'BANK RESPUBLIKA' OJSC             
    'BANK SGB' PJSC                    
    'BELAGROPROMBANK' JSC              
    ''GARAGUM'' BANK INTERNATIONAL JOIN
    'HIMIK' OPEN JOINT-STOCK COMPANY   
    'INDUSTRIALBANK'                   
    'LATVIJAS PRIVATBANKA' JOINT-S     
    'MOSTRANSBANK' AO                  
    'RADABANK' JOINT STOCK BANK        
    'RUBLEVSKY' COMMERCIAL BANK OOO    
    'VERHNEVOLZHSKIY' CB OAO           
    'VOLZHSKY UNIVERSAL BANK' OAO      
     
    MIN(BIC_NAME)                      
    -----------------------------------
    1ST ENTERPRISE BANK                
    1ST NATIONAL BANK ST.LUCIA LIMITED 
    123VENTURE SA                      
    1492 CAPITAL MANAGEMENT, LLC       
    1607 CAPITAL PARTNERS, LLC         
    1776 RIVERBANK LTD                 
    1818 GESTION                       
    2CG LIMITED                        
    2W / KALTCHUGA                     
    2XIDEAS AG                         
    360 AM                             
    9 TELECOM                          
     
     
    34 rows selected.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Citation Envoyé par Ikebukuro Voir le message
    Déjà, que je n'ai pas mis de Order by, et que la requête soit ordonnée sur le deuxième champ... je trouve ça bizarre bizarre
    En fait, c'est assez logique : vous faites un regroupement sur cette colonne. Il est probable que l’optimiseur choisisse de trier les lignes sur cette colonne afin d'effectuer le regroupement. Le résultat semble donc trié sur cette colonne.


    Citation Envoyé par Ikebukuro Voir le message
    Donc, si je réfléchis, dans ma première liste, Oracle considère que AFL est le MAX parmi les MIN du champ Bic_name ?
    C'est bien ça, et j'ajouterai qu'il a raison : F > D donc AFL > ADFA....
    qu'attendiez-vous comme résultat ?

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il attendait la dernière ligne de cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select min(bic_name) from bic_code group by length(bic_name) order by min(bic_name)
    soit '9 TELECOM'

    Voici un cas plus faciel à comprendre :
    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 col, 
    			(SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_SORT') Sess, 
    			(SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE parameter = 'NLS_SORT') base
    FROM (SELECT '9' col FROM dual UNION ALL SELECT 'A' col FROM dual  ) 
    ORDER BY col
     
    COL	SESS	BASE
    9	BINARY	BINARY
    A	BINARY	BINARY
     
    SELECT MAX(col)
    FROM (SELECT '9' col FROM dual UNION ALL SELECT 'A' col FROM dual  ) 
     
    MAX(COL)
    A
    Le MAX est bien la dernière ligne de l'ORDER BY

    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
    ALTER SESSION set NLS_SORT='French'
     
    SELECT col, 
    			(SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_SORT') Sess, 
    			(SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE parameter = 'NLS_SORT') base
    FROM (SELECT '9' col FROM dual UNION ALL SELECT 'A' col FROM dual  ) 
    ORDER BY col
     
    COL	SESS	BASE
    A	FRENCH	BINARY
    9	FRENCH	BINARY
     
    SELECT MAX(col)
    FROM (SELECT '9' col FROM dual UNION ALL SELECT 'A' col FROM dual  ) 
     
    MAX(COL)
    A
    Le MAX n'est pas la dernière ligne de l'ORDER BY

    Je n'apporte pas de solution, je pense que le MAX ne se base pas sur le NLS_SORT de la session.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Voici la réponse http://docs.oracle.com/cd/B19306_01/...t.htm#CIHJBFAD

    Oracle se base sur le NLS_COMP

    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
    ALTER SESSION set NLS_COMP='Linguistic'
     
    SELECT col, 
    			(SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_SORT') srt, 
    			(SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_COMP') cmp
    FROM (SELECT '9' col FROM dual UNION ALL SELECT 'A' col FROM dual  ) 
    ORDER BY col
     
    A
    9
     
     
    SELECT MAX(col)
    FROM (SELECT '9' col FROM dual UNION ALL SELECT 'A' col FROM dual  )
     
    9
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    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
    Je vous remercie pour toutes vos réponses; je vais regarder ça à tête reposée
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/07/2006, 09h41
  2. [SQL-Serveur][Sybase]Fonctions d'agrégat imbriquées
    Par vincenteraptor dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/06/2006, 09h46
  3. Réponses: 2
    Dernier message: 11/04/2006, 16h09
  4. Réponses: 6
    Dernier message: 14/02/2006, 11h29
  5. [MySQL] Requetes imbriquées, problème de groupage
    Par cdelamarre dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2006, 21h16

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