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

SQL Oracle Discussion :

Delete avec jointure sur deux tables


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Delete avec jointure sur deux tables
    Bonjour,

    J'ai fait une requete où je retrouve des enregistrements que je dois supprimer.
    mais ma requete ne fonctionne qu'en select et pas en delete from.
    j'ai des enregistrements à supprimer dans les 2 tables, car ils sont liés.
    Je n'ai pas la possibilité de faire une table puis l'autre.
    J'ai des champs non utilisés et je pensais faire un update d'abord et ensuite aller sur chaque table faire un delete, mais je n'arrive pas non plus à le faire ....
    si vous pouvez m'aider ça me rendrait grandement service. ( j'avais plus l'habitude de faire cela avec mssql)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select distinct(f_lig.cd_facid)
    from f_lig,f_fac
    where fac_num is null and lig_date='13/07/2005'
    and lig_tp_lig <>'G' and lig_tp_lig <>'A'
    and cd_reg is null and fac_annul is null;

  2. #2
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Qatar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Points : 334
    Points
    334
    Par défaut
    Bonjour,

    Faites un screen du retour de votre requête d'un peu du contenu des tables.

    En plus, vous utilisez deux tables et aucune jointure à ce que je vois ?

    ...

    EDIT : Des alias aussi simplifieront la tache de compréhension.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonsoir, celle-la est ma première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select distinct(f_fac.cd_facid),
    lig_date,
    fac_num,
    cd_soin,
    cd_forf,
    cd_abon,
    cd_bout,
    cd_reg 
    from f_fac left join f_lig 
    on f_lig.cd_facid=f_fac.cd_facid 
    where fac_num is null 
    and lig_date<'31/12/2005';
    et le select est exact.
    Images attachées Images attachées  

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    ou bien comme cela ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select distinct(f_fac.cd_facid) Idfacture,
    lig_date dateLigne,
    fac_num numerofacture,
    cd_soin lignesoin,
    cd_forf ligneforfait,
    cd_abon ligneabonnement,
    cd_bout ligneboutique,
    cd_reg lignereglement 
    from f_fac left join f_lig 
    on f_lig.cd_facid=f_fac.cd_facid 
    where fac_num is null 
    and lig_date<'31/12/2005';
    Images attachées Images attachées  

  5. #5
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Pour faire un delete il faut que tu utilises la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE * FROM table_supprimer WHERE champ IN (SELECT champ FROM table_reference INNER....)
    Sinon tu ne pourras pas supprimer...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Merci
    j'ai fait ce que vous m'avez demandé, mais j'ai une violation de contrainte

    Erreur SQL : ORA-02292: violation de contrainte (BALNEARIO.FK_F_LIG_LIG_FAC_F_FAC) d'intégrité - enregistrement fils existant
    02292. 00000 - "integrity constraint (%s.%s) violated - child record found"
    *Cause: attempted to delete a parent key value that had a foreign
    dependency.
    *Action: delete dependencies first then parent or disable constraint.
    je crois que je vais devoir les supprimer à la main.... qu'en est-il ?

    Merci beaucoup

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Qatar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 489
    Points : 334
    Points
    334
    Par défaut
    Il faut identifier la contrainte d'intégrité et utiliser un delete en cascade sinon supprimer les champs fils puis parents.

    Faites une recherche sur la syntaxe exacte de la commande DELETE.

  8. #8
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    De ce que je vois de ton code, as-tu essayé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE * FROM f_lig WHERE f_lig.cd_facid
    IN (SELECT DISTINCT(f_lig.cd_facid)
    FROM f_lig,f_fac
    WHERE fac_num IS NULL AND lig_date='13/07/2005'
    AND lig_tp_lig <>'G' AND lig_tp_lig <>'A'
    AND cd_reg IS NULL AND fac_annul IS NULL;)
    Mais tu dois avoir un problème avec des indépendances. Tu ne pourras supprimer ces lignes que quand tu les auras supprimées dans une autre table... Les données qui sont dans cette table doivent servir dans une autre, et c'est pour cela que tu ne peux pas les supprimer !!!

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    en fait j'ai trouvé une solution pour contourner la contrainte.
    dans les tables, les enregistrements cherchés ne peuvent se trouver qu'avec la condition d'un champ de la table fac et la condition d'un autre champ de la table lig.... c'est le chat qui se mort la queue

    j'ai donc fait un update sur un champ non utilisé de chacune de ces tables, pour ensuite aller supprimer mes enregistrements dans l'ordre, lig puis fac.

    ça vous semble ok dans le doc joint ?

    merci,
    et merci pour votre aide.
    Fichiers attachés Fichiers attachés

  10. #10
    Rédacteur

    Avatar de zoom61
    Homme Profil pro
    ...
    Inscrit en
    Janvier 2005
    Messages
    9 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : ...
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 9 429
    Points : 58 222
    Points
    58 222
    Billets dans le blog
    11
    Par défaut
    Cela me semble correct...

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    j'ai fait un test, et c'est concluant.
    Merci encore .
    Bonne soirée

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

Discussions similaires

  1. Requête SELECT avec jointure sur deux tables
    Par bud64 dans le forum Requêtes
    Réponses: 6
    Dernier message: 01/10/2010, 14h06
  2. [Requête] Jointure sur deux tables.
    Par Invité dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/11/2007, 11h36
  3. Jointure sur deux tables
    Par shinji_rem dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/04/2007, 10h18
  4. [c#]commande Select avec jointure de deux tables
    Par chorokari dans le forum Accès aux données
    Réponses: 6
    Dernier message: 18/10/2006, 14h47
  5. Jointures sur deux tables
    Par spirou dans le forum Requêtes
    Réponses: 6
    Dernier message: 31/05/2006, 15h46

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