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

Firebird Discussion :

Demande Requête SQL


Sujet :

Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2014
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2014
    Messages : 4
    Par défaut Demande Requête SQL
    Bonjour à tous,
    J'ai une requête qui à l'air un peu compliquée en pur SQL. Je me demande si c'est réalisable sans procédure stockée, php ou autre.
    Voici le résultat de mon SELECT initial :

    PluCode;ProductNumber;PluNumber
    123456;13111;10
    234567;13111;11
    345678;13111;12
    456789;54875;10

    Ce qui serait magique, c'est de pouvoir par l'intermédiaire d'un DELETE, supprimer les lignes qui ont le même ProductNumber (13111) sauf celle qui a le PluNumber le plus élevé (12).
    Il me faudrait une seule requête (lourde j'en conviens, mais j'ai que 50 lignes en moyenne).

    Mon tableau final si je refait le SELECT de l'exemple devra me donner :

    345678;13111;12
    456789;54875;10

    Est-ce réalisable sur une seule requête ? avec MAX() ou IN() ou EXIST() peut-être. Je ne connais pas bien toute les fonctions SQL.

    Par avance, merci beaucoup !

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    le "sans procédure stockée" complique les choses mais heureusement il y a "EXECUTE BLOCK"

    Quelque chose comme (à vérifier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    EXECUTE BLOCK 
    AS 
    DECLARE VARIABLE PN <type Productnumber>;
    DECLARE VARIABLE PU <type Plunumber>;
    BEGIN
     FOR SELECT PRODUCTNUMBER,MAX(PLUNUMBER) FROM <nomtable> GROUP BY PRODUCTNUMBER INTO :PN,:PU 
     DO DELETE FROM <nomtable> WHERE PRODUCTNUMBER=:PN AND PLUNUMBER<:PU;
    END
    plutôt que de nous fournir ceci
    PluCode;ProductNumber;PluNumber
    123456;13111;10
    234567;13111;11
    345678;13111;12
    456789;54875;10
    il aurait été mieux de nous fournir sous forme de script SQL (règle générale du forum Base de données/langage SQL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE DUMMY (PluCode  INTEGER, ProductNumber INTEGER, PluNumber INTEGER);
    COMMIT;
    INSERT INTO DUMMY (PluCode,ProductNumber,PluNumber) VALUES (123456,13111,10);
    INSERT INTO DUMMY (PluCode,ProductNumber,PluNumber) VALUES (234567,13111,11);
    INSERT INTO DUMMY (PluCode,ProductNumber,PluNumber) VALUES (345678,13111,12);
    INSERT INTO DUMMY (PluCode,ProductNumber,PluNumber) VALUES (456789,54875,10);
    INSERT INTO DUMMY (PluCode,ProductNumber,PluNumber) VALUES (123456,13111,10);
    INSERT INTO DUMMY (PluCode,ProductNumber,PluNumber) VALUES (234567,13111,11);
    INSERT INTO DUMMY (PluCode,ProductNumber,PluNumber) VALUES (345678,13111,12);
    INSERT INTO DUMMY (PluCode,ProductNumber,PluNumber) VALUES (456789,54875,10);
    COMMIT;
    ce qui, le matin de bonne heure, m'aurait rendu
    P.S. puisque j'ai fait le script j'ai fait l'essai avec Flamerobin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    set term ^;
    EXECUTE BLOCK 
    AS
    DECLARE VARIABLE PN INTEGER;
    DECLARE VARIABLE PU INTEGER;
    BEGIN
     FOR SELECT PRODUCTNUMBER,MAX(PLUNUMBER) FROM DUMMY GROUP BY PRODUCTNUMBER INTO :PN,:PU 
     DO DELETE FROM DUMMY WHERE PRODUCTNUMBER=:PN AND PLUNUMBER<:PU;
    END^
    set term ;^
    COMMIT;
    SELECT PluCode ,ProductNumber, PluNumber FROM DUMMY;
    me retourne bien le résultat escompté
    345678 13111 12
    456789 54875 10

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 638
    Billets dans le blog
    65
    Par défaut
    La discussion ayant été fermée (soit par mégarde de ma part, soit par quelqu'un d'autre ne nous ayant pas informé) je reporte le message de Philippe
    Citation Envoyé par Ph.B.
    Bonjour,

    La discussion (http://www.developpez.net/forums/d14...e-requete-sql/) sur le forum étant fermée (je ne connaissais pas cette fonctionnalité )

    Je vous envoie à tous les deux via message privé comment j'aurais résolu ce problème et en une seule requête.

    /* Cas général (on ne garde que les max de chaque Productnumber) */
    DELETE FROM dummy D
    WHERE PluNumber != (SELECT MAX(PluNumber) FROM dummy WHERE ProductNumber = D.ProductNumber);
    /* Cas particulier (on ne garde que le max du Productnumber = 13111) */
    DELETE FROM dummy D
    WHERE PluNumber != (SELECT MAX(PluNumber) FROM dummy WHERE ProductNumber = 13111);

    Cela dit, je "plussoie" la remarque de SergioMaster (http://www.developpez.net/forums/u138527/sergiomaster/) sur le fait de donner un jeu d'essais pertinent sous forme de requêtes SQL !
    j'en ai profité pour réactiver (je crois) la discussion
    [edit] ce n'est que maintenant que je l'ai vraiment rouverte
    (je ne connaissais pas cette fonctionnalité )
    accessible au modérateurs

Discussions similaires

  1. demande requête sql sous delphi 7
    Par wiski08000 dans le forum Débuter
    Réponses: 15
    Dernier message: 17/12/2013, 16h44
  2. Demande requête SQL
    Par praksh dans le forum SQL
    Réponses: 2
    Dernier message: 12/09/2013, 11h58
  3. Demande Requête SQL
    Par TCHITCHOO dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/06/2010, 09h53
  4. Demande saisie dans une requête SQL !!
    Par Shakan972 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 27/03/2006, 15h38

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