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 :

Select MAX sur plusieurs table sans group by


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Select MAX sur plusieurs table sans group by
    J'ai les tables suivantes :

    Table1
    id1 nom1
    1 Etape1
    2 Etape2
    3 Etape3
    4 Etape4


    Table2
    id2 nom2
    1 description1
    2 description2
    3 description3


    Table_assoc
    id1 id2
    1 1
    2 1
    3 1
    1 2
    2 2
    1 3
    2 3
    3 3
    4 3


    J'ai comme contrainte de ne pas utiliser de group by et je dois avoir le résultat :
    nom2 MAX nom1
    description1 etape3
    description2 etape2
    description3 etape4


    C'est le sans GROUP BY, juste avec des select, from, where qui me cause problème ... quelqu'un peut m'aider ?

  2. #2
    Membre éclairé
    Bonjour,

    Si tu ne peux pas utiliser GROUP BY j'espère que tu peux utiliser les fonctions analytiques. Par exemple:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select table2.nom2, table1.nom1
    from table2
    join (select id1, id2, row_number() over (partition by id2 order by id1 desc) as rn from table_assoc) as v on v.id2 = table2.id2 and v.rn = 1
    join table1 on table1.id1 = v.id1
    order by 1;

  3. #3
    Modérateur

    bonjour,

    ça ressemble a un exercice

    Un indice : Le MAX, c'est celui pour lequel il n'existe pas de plus grand !

  4. #4
    Rédacteur

    Autre solution, utiliser l'opérateur ALL avec >= et une sous requête.

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  5. #5
    Rédacteur

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select T1.nom1, T2.nom2
    from   table1 AS T1
           join table_assoc AS TA ON T1.id1 = TA.id1
           join table2 AS T2.id2 = v.id1
    WHERE  T2.nom2 >= ALL (SELECT T2.nom2 
                          FROM   table2 AS T 
                          WHERE T.Id2 = T2.id2)
    order by 1;


    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  6. #6
    Futur Membre du Club
    En fait présentement j'avais le code suivant qui fonctionne bien, sauf qu'il me donne le id1 au lieu du nom1, est-ce que je peux faire en sorte qu'il m'affiche aussi le nom1

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T2.nomProjet, (SELECT MAX (TA.id1)
    FROM Table_Assoc TA
    WHERE T2.id2 = TA.id2)
    FROM Table2 T2
    ;


    Présentement je reçois le résultat suivant :
    Description1 id3
    Description2 id2
    Description3 id4


    Mais j'aurais besoin qu'il me renvoit :
    Description1 etape3
    Description2 etape2
    Description3 etape4

    ou encore :
    Description1 id3 etape3
    Description2 id2 etape2
    Description3 id4 etape4

  7. #7
    Futur Membre du Club
    OK, trouvé :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T2.nom2,  T1.nom1
        From Table2 T2, Table1 T1
        WHERE T1.id1= (SELECT Max (TA.id1) FROM Table_Asso TA WHERE T2.id2 = TA.idProjet)
    ;

  8. #8
    Modérateur

    A noter que cette requête fait un GROUP BY () implicite (dans la sous requête)...

###raw>template_hook.ano_emploi###