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 :

Suppression avec condition de type sous-requête


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Suppression avec condition de type sous-requête
    Salut,

    Pouvez m'aider a debuger cette requete ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DELETE *
    FROM delta
    WHERE instrument1  IN (SELECT instrument1, delta
    FROM delta
    WHERE delta <>0
    GROUP BY instrument1, delta
    HAVING COUNT(*) > 3;);
    You have written a subquery that can return more than one field without using the EXISTS reserved word in the main query's FROM clause. Revise the SELECT statement of the subquery to request only one field.

    MErci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Vous feriez mieux d'expliquer ce que vous souhaitez faire.

    Voici ce que je lis :

    Bonjour, je souhaite enlever de "delta" tous les instruments qui ont plus de trois "instruments, delta" dont les "delta" de "delta" sont différents de zéro.
    Néanmoins l'erreur du SGBD indique que vous n'avez pas le droit de chercher une valeur dans un résultat comportant plusieurs valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    instrument1 IN (select instrument1, delta...)
    Revise the SELECT statement of the subquery to request only one field.

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Je conclus à partir du message de Waldar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE *
    FROM delta
    WHERE instrument1  IN (SELECT instrument1
    FROM delta
    WHERE delta <>0
    GROUP BY instrument1, delta
    HAVING COUNT(*) > 3;);

  4. #4
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 790
    Points : 3 056
    Points
    3 056
    Par défaut
    Ton problème se situait dans ton subquery : tu sélectionnes deux colonnes or il faut n'en sélectionner qu'une. Exactement comme Antoun l'a écrit.

    Ton code ci-dessous compare Instrument1 avec ... deux colonnes. C'est impossible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE instrument1  IN (SELECT instrument1, delta

  5. #5
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonjour,

    On supprime des lignes pas des colonnes, donc c'est
    DELETE FROM Delta WHERE [...] et pas DELETE *

    Tu ramènes 2 colonnes dans ta sous-requête, mais tu n'utilises que la colonne instrument1 dans le WHERE de ton DELETE.
    Si par miracle ça avait marché
    DELETE * FROM delta WHERE instrument1
    aurait supprimé toutes les lignes dont la valeur de instrument1 est retournée par
    la sous-requête.
    (IE sans tenir compte de
    GROUP BY instrument1, delta
    HAVING COUNT(*) > 3; )

    Si ton SGBD accepte la syntaxe des constructeurs valués remplace
    WHERE instrument1 IN (SELECT instrument1, delta) par
    WHERE (instrument1, delta) IN (SELECT instrument1, delta [...]

    sinon tu peux tenter de concaténer les 2 col. retournées par la sous-requête
    en faisant qque chse de ce genre là.
    WHERE instrument || delta IN (SELECT instrument1 || delta [...]

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

Discussions similaires

  1. Pagination avec table jointe et sous-requête
    Par dovmeup dans le forum Requêtes
    Réponses: 11
    Dernier message: 30/05/2014, 09h11
  2. [E-03] Copie de ligne avec condition de type rechercheV
    Par Lufia dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/02/2009, 14h24
  3. [MySQL] Condition IN avec sous requête
    Par emphase dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/02/2007, 01h43
  4. Suppression avec sous-requête conditionnelle
    Par Magnus dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/10/2005, 10h39
  5. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20

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