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

DB2 Discussion :

DELETE lignes dont la clé est dans une table et absente d'une autre


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Juin 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 1
    Par défaut DELETE lignes dont la clé est dans une table et absente d'une autre
    Bonjour,

    Je travaille actuellement sur 2 tables dans la configuration suivante

    TABLE1
    CODE1 PIC 9(005) (clé primaire)
    TS1 PIC X(026) (clé primaire)
    Données ...

    TABLE2
    CODE1 PIC 9(005) (clé primaire)
    TS1 PIC X(026) (clé primaire)
    CPT1 PIC 9(003) (clé primaire)
    Données ...

    Normalement, les lignes dans TABLE2 doivent avoir leur équivalent dans TABLE1 avec le même CODE1 et le même TS1. Mais, chez mon client, il n'y a pas de contrainte d'intégrité référentielle. Du coup on trouve des lignes présentes dans TABLE2 et pas dans TABLE1 ce qui fait planter des programmes.

    Je dois donc développer un programme qui supprime les lignes présentes dans TABLE2 sans équivalent dans TABLE1 mais j'ai des contraintes à respecter au niveau des requêtes DB2 :
    - Pas de requête imbriquée ou sous-requête
    - Pas de FETCH pour modification

    J'ai donc essayé ça :
    DELETE
    FROM TEST.TABLE2 B
    LEFT OUTER JOIN TEST.TABLE1 A
    ON (A.CODE1 = B.CODE1
    AND A.TS1 = B.TS1)
    WHERE A.CODE1 IS NULL
    ;

    Mais SPUFI n'a pas aimé :
    SQLCODE = -199, ERROR: ILLEGAL USE OF KEYWORD LEFT. TOKEN INCLUDE
    <END-OF-STATEMENT> QUERYNO WHERE SKIP WITH SET WAS EXPECTED
    SQLSTATE = 42601 SQLSTATE RETURN CODE
    SQLERRP = DSNHPARS SQL PROCEDURE DETECTING ERROR
    SQLERRD = 2 0 0 -1 151 506 SQL DIAGNOSTIC INFORMATION
    SQLERRD = X'00000002' X'00000000' X'00000000' X'FFFFFFFF'
    X'00000097' X'000001FA' SQL DIAGNOSTIC INFORMATION

    Alors qu'il accepte très bien :
    SELECT *
    FROM TEST.TABLE2 B
    LEFT OUTER JOIN TEST.TABLE1 A
    ON (A.CODE1 = B.CODE1
    AND A.TS1 = B.TS1)
    WHERE A.CODE1 IS NULL
    ;

    Cela me retourne très bien les lignes incriminées.
    Si j'avais la possibilité de faire du DELETE sur des lignes fetchées, j'aurais déjà la solution, mais c'est interdit.

    Quelqu'un aurait-il une solution pour réaliser cela sans requête imbriquée et sans DELETE sur un FETCH ?

    Merci d'avance !

  2. #2
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Par défaut
    Citation Envoyé par Samuel_Vimaire Voir le message
    ...
    Je dois donc développer un programme qui supprime les lignes présentes dans TABLE2 sans équivalent dans TABLE1 mais j'ai des contraintes à respecter au niveau des requêtes DB2 :
    - Pas de requête imbriquée ou sous-requête
    - Pas de FETCH pour modification
    Mon dieu ... encore un exemple de règles débiles ...


    Mais SPUFI n'a pas aimé
    Normal ... la notion de jointure ne s'applique qu'au SELECT ...


    Quelqu'un aurait-il une solution pour réaliser cela sans requête imbriquée et sans DELETE sur un FETCH ?
    Est ce que la récupération de la clé primaire sur un curseur puis un DELETE direct sur la clé ainsi récupérée est permis ?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Par défaut
    Bonjour

    Cette instruction devrait faire ce que tu veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    delete
    from test.table2 a
    where not exists (select '*' from test.table1 b where b.code1=a.code1 and b.ts1=a.ts1) ;

  4. #4
    Membre Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    Par défaut
    Citation Envoyé par pwrdwnsys Voir le message
    Bonjour

    Cette instruction devrait faire ce que tu veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    delete
    from test.table2 a
    where not exists (select '*' from test.table1 b where b.code1=a.code1 and b.ts1=a.ts1) ;
    Il y a une sous-requete, donc pas adapté à la demande. J'aurais bien aussi proposé........

  5. #5
    Membre expérimenté
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Par défaut
    Citation Envoyé par bernard59139 Voir le message
    Il y a une sous-requete, donc pas adapté à la demande. J'aurais bien aussi proposé........
    Effectivement (j'avais zappé ce postulat ridicule), mais du coup, s'il faut vraiment se plier à des règles totalement dépassées, il ne faut plus faire de SQL et il faut développer des programmes de quelques dizaines de lignes pour faire la même chose de manière moins lisible et avec probablement plus de risque de bogue...
    Et du coup, en SQL, je ne vois aucune solution autre qu'une sous-requête, puisque la valeur de la clé est externe...

  6. #6
    Membre Expert Avatar de bernard59139
    Profil pro
    Retired
    Inscrit en
    Octobre 2006
    Messages
    966
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retired

    Informations forums :
    Inscription : Octobre 2006
    Messages : 966
    Par défaut
    Je connais ce genre de règles "ridicules", souvent faites pour éviter que des personnes mettent à jour des tables avec des LOCK qui durent, qui durent.................
    @ +

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/06/2010, 03h18
  2. Réponses: 4
    Dernier message: 01/04/2010, 12h06
  3. [Modèle Relationnel] Faire une table par type ou une table des types ?
    Par jax54000 dans le forum Schéma
    Réponses: 12
    Dernier message: 18/11/2009, 11h43
  4. [MySQL] Créer une table actuelle à partir d'une table historique
    Par cleminute dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/10/2009, 14h35
  5. recupérer les info d'une table X pour alimenter une table Y
    Par lemerite dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/09/2008, 11h31

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