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 :

Aide pour requête comparant des champs de deux tables différentes


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Informaticien autodidacte
    Inscrit en
    Août 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Informaticien autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 31
    Points : 18
    Points
    18
    Par défaut Aide pour requête comparant des champs de deux tables différentes
    Bonjour le forum,


    Je suis très loin d'être un pro de SQL... mais j'ai besoin de faire une manip sur notre ERP. Je vais tâcher d'être clair !
    J'ai deux tables :
    ARTICLE, qui comprend (entre autres) les champs ARKTSOC, ARKTCODART, ARCTCODEP, ARCTCODMPL
    STDEPLOT, qui comprend (entre autres) les champs DPKTSOC, DPKTCODART, DPKTDEPOT, DPKTCODMPL

    Je veux supprimer de STDEPLOT les enregistrements suivant ces critères :
    - DPKTDEPOT = ARCTCODEP
    ET
    - DPKTCODART = ARKTCODART
    ET
    - DPKTCODMPL <> ARCTCODMPL
    J'ai tenté un truc comme çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete from stdeplot where dpktsoc=¿103¿ and article.arktcodep=dpktdepot and article.arktcodart=dpktcodart and dpktcodmpl<>article.arktcodmpl
    mais il ne se passe rien... même pas un message d'insulte, ce qui laisserait supposer que la syntaxe est compréhensible.. et c'est tout !

    Si une âme charitable passe par là, toute aide sera la bienvenue !
    Merci d'avance

    ThierryP

  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,

    Quel est votre SGBD ?

    Vous pouvez essayer ceci, mais je ne suis pas certains que ça corresponde à ce que vous voulez faire (un exemple serait le bienvenu). testez donc sur une base de test !
    Par ailleurs, il peut y avoir mieux en fonction de votre SGBD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    delete from stdeplot 
    where EXISTS (
    	SELECT 1
    	FROM ARTICLE 
    	WHERE dpktsoc=103
    	and article.arktcodep=dpktdepot and article.arktcodart=dpktcodart 
    	and dpktcodmpl<>article.arktcodmpl
    )

  3. #3
    Membre à l'essai
    Homme Profil pro
    Informaticien autodidacte
    Inscrit en
    Août 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Informaticien autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Bonsoir,

    En fait, on a MS SQL Server 2008 sur un serveur, et notre ERP( Cégid PMI) a une interface qui permet de créer et d'exécuter des requêtes.
    De mon côté, j'ai fini par trouver ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select dpktcodart from stdeplot, article where dpktsoc=¿100¿ and arktsoc=¿100¿ and dpktcodart = arktcodart and dpktcodmpl <> arctcodmpl
    .... qui fonctionne pour un select, mais cette syntaxe n'est pas bonne pour un delete.
    Un exemple :
    Dans ma table ARTICLE, chaque ARKTCODART est unique. Ex : ARKTCODART = 057679 (réf. article) et ARCTCODMPL = C32 (Emplacement magasin)
    Dans ma base STDEPLOT, il peut y avoir plusieurs enregistrements avec le même DPKTCODART, le champ DPKTCODMPL n'est pas unique :
    DPKTCODART DPKTCODMPL
    057679 C32
    057679 F14 etc...
    Je souhaite supprimer l'enregistrement 057679 F14 (emplacement différent de celui défini dans la table ARTICLE)

  4. #4
    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
    Citation Envoyé par ThierryP73
    mais cette syntaxe n'est pas bonne pour un delete
    Si, il faut juste l'adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete from stdeplot from stdeplot, article where dpktsoc=¿100¿ and arktsoc=¿100¿ and dpktcodart = arktcodart and dpktcodmpl <> arctcodmpl
    devrait fonctionner

    on pourrait cependant raffiner en mettant des alias aux tables et en normalisant les jointures.

  5. #5
    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 790
    Points
    30 790
    Par défaut
    La syntaxe normalisée c'est delete from <table> where <condition>Ce qui donnerait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    delete
    from    stdeplot    std 
    where   exists
            (   select  null
                from    article art 
                where   art.arktsoc     = '100' 
                    and std.dpktcodart  = art.arktcodart 
                    and std.dpktcodmpl  <> art.arctcodmpl
            )
        and std.dpktsoc = '100' 
    ;
    (en supposant que les noms de colonne de article commencent par art et ceux de stdeplot par dpkt)

    PS : Si tu souhaites une réponse utilisant la syntaxe non normalisée appliquée par un SGBD particulier, précise celui que tu utilises ou - encore mieux - poste ta question dans le sous-forum correspondant.
    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.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Plus exactement, la syntaxe sous SQL Server est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    delete from T 
    from   stdeplot AS T
           JOIN article AS A
    	        ON dpktcodart = arktcodart and dpktcodmpl <> arctcodmpl
    where dpktsoc=¿100¿ and arktsoc=¿100¿
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre à l'essai
    Homme Profil pro
    Informaticien autodidacte
    Inscrit en
    Août 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Informaticien autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2015
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Bonsoir,

    Merci pour le coup de main ! ça fonctionne, sauf que mon interface n'accepte pas trop les alias.
    Il va vraiment falloir que je plonge dans SQL !

    ThierryP

    Citation Envoyé par al1_24 Voir le message
    La syntaxe normalisée c'est delete from <table> where <condition>Ce qui donnerait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    delete
    from    stdeplot    std 
    where   exists
            (   select  null
                from    article art 
                where   art.arktsoc     = '100' 
                    and std.dpktcodart  = art.arktcodart 
                    and std.dpktcodmpl  <> art.arctcodmpl
            )
        and std.dpktsoc = '100' 
    ;
    (en supposant que les noms de colonne de article commencent par art et ceux de stdeplot par dpkt)

    PS : Si tu souhaites une réponse utilisant la syntaxe non normalisée appliquée par un SGBD particulier, précise celui que tu utilises ou - encore mieux - poste ta question dans le sous-forum correspondant.

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

Discussions similaires

  1. Calculer des champs entre deux tables
    Par bhami9 dans le forum Bases de données
    Réponses: 7
    Dernier message: 12/10/2010, 18h34
  2. Réponses: 3
    Dernier message: 04/03/2010, 10h03
  3. Réponses: 1
    Dernier message: 01/03/2009, 16h53
  4. [ADO]Utiliser OpenSchema pour le listing des champs d'une table
    Par bruce-willis dans le forum C++Builder
    Réponses: 0
    Dernier message: 10/03/2008, 09h24
  5. [requête sql]comment comparer des enregistrements de deux tables
    Par DSabah dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 01/06/2007, 15h12

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