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 :

Requête SQL ayant un group by dans la condition


Sujet :

Langage SQL

  1. #1
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 593
    Points : 353
    Points
    353
    Par défaut Requête SQL ayant un group by dans la condition
    Bonjour,

    Supposons que j'ai la table suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ------------------------------
    id | actif | enregistrement
    ------------------------------
    3  | O     | 2015-10-16
    3  | O     | 2015-10-15
    3  | N     | 2015-10-14
    4  | N     | 2015-10-15
    4  | O     | 2015-10-14
    La requête que je veux faire doit faire un update sur la table ayant les conditions suivantes:
    - l'id a une colonne actif = 'O' plus d'une fois
    - parmi ces lignes ayant la colonne actif = 'O' plus d'une fois, mon update devra les changer en actif = 'N', sauf celle ayant la date d'enregistrement la plus récente, qui devra rester à 'O'.

    Dans la table ci-dessus, l'id ayant plus d'une fois colonne actif = 'O' est le 3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ------------------------------
    id | actif | enregistrement
    ------------------------------
    3  | O     | 2015-10-16
    3  | O     | 2015-10-15
    3  | N     | 2015-10-14
    On doit mettre actif = 'N', sauf à la ligne ayant l'enregistrement le plus récent, qu'on doit laisser à 'O'. Dans notre exemple, on laissera donc la ligne ayant enregistrement = 2015-10-16.
    J'ai essayé cette requête, mais il y a erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    update test as t1,
    (select id
    from test
    where actif = 'O'
    group by id
    having count(*) > 1) as t2
    set t1.actif = 'N'
    where t1.enregistrement != max(t2.enregistrement);
    Avez-vous une idée de la requête qu'il faut faire?
    Merci!

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    c'est un truc comme ca je crois...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update test A
    set A.actif = 'N' 
    where exists (select 1 from test B where A.id = B.id and B.actif = 'O' and A.enregistrement < B.enregistrement)
    and A.actif = 'O'

  3. #3
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 593
    Points : 353
    Points
    353
    Par défaut
    @bstevy: Merci. J'ai essayé mais la requête renvoie cette erreur:

    Error Code: 1093. You can't specify target table 'A' for update in FROM clause

    Si ça vous intéresse, la requête suivante me donne bien le résultat que je cherche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE test
    JOIN (
      SELECT 
      id, MAX(enregistrement) AS max_enregistrement
      FROM test
      WHERE actif = 'O'
      GROUP BY id
      HAVING COUNT(*) > 1
    ) sq ON test.id = sq.id
    SET test.active = IF(test.record = sq.max_record, 'O', 'N');

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    La requête proposée par bstevy est conforme au standard.
    La syntaxe que tu emploies est spécifique au SGBD que tu utilises... d'ailleurs tu n'as pas précisé duquel il s'agissait.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2011
    Messages : 593
    Points : 353
    Points
    353
    Par défaut
    Effectivement, j'utilise MySQL. D'ailleurs, le 'IF' que j'ai mis dans la requête ne fonctionnera pas ailleurs.

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

Discussions similaires

  1. Ma requête SQL SELECT ne passe pas dans next()
    Par Somato dans le forum Bases de données
    Réponses: 17
    Dernier message: 02/06/2008, 15h45
  2. Réponses: 1
    Dernier message: 08/08/2007, 11h26
  3. [Requête/SQL]ajouter un champ calculé dans une table
    Par zougna dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 17/04/2007, 19h09
  4. [Requête/SQL]Calcul d'un solde dans une requête ou un état
    Par alalau dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/04/2007, 16h02
  5. erreur de requête SQL avec ASP mais pas dans Access
    Par csszzen dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/03/2007, 09h07

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