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

 Oracle Discussion :

Problème de requête sur des doublons


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 55
    Points : 33
    Points
    33
    Par défaut Problème de requête sur des doublons
    Bonjour à tous,

    j'ai des doublons dans une table D_FUNCTION, et je souhaite les éliminer afin qu'il ne reste qu'un exemplaire de chaque ligne.

    Ma requète utilise pour cela une table temporaire T_DOUBLON_TEMP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SELECT DISTINCT ( NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE )
    INTO   T_DOUBLON_TEMP
    FROM   D_FUNCTION
    GROUP  BY NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    HAVING COUNT(*) > 1;
     
    DELETE
    FROM D_FUNCTION d 
    WHERE EXISTS( SELECT * FROM D_FUNCTION d2
    WHERE d.NAME_FUNCTION = d2.NAME_FUNCTION 
    AND d.CREATE_DATE = d2.CREATE_DATE 
    AND d.UPDATE_DATE = d2.UPDATE_DATE 
    AND d.LOGIN_USER = d2.LOGIN_USER 
    AND d.LOGIN_USER_UPDATE = d2.LOGIN_USER_UPDATE 
    GROUP  BY NAME_FUNCTION,CREATE_DATE,UPDATE_DATE,LOGIN_USER,LOGIN_USER_UPDATE
          HAVING COUNT(*) > 1);
     
    INSERT INTO D_FUNCTION
    SELECT NAME_FUNCTION,CREATE_DATE,UPDATE_DATE,LOGIN_USER,LOGIN_USER_UPDATE
    FROM   T_DOUBLON_TEMP;
     
    DROP TABLE T_DOUBLON_TMP;
    Mon code semble pourtant bon, mais j'obtiens les erreurs suivantes :
    Erreur commençant à la ligne 1 de la commande :
    SELECT DISTINCT NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    INTO T_DOUBLON_TEMP
    FROM D_FUNCTION
    GROUP BY NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    HAVING COUNT(*) > 1
    Erreur à la ligne de commande : 2, colonne : 7
    Rapport d'erreur :
    Erreur SQL : ORA-00905: missing keyword
    00905. 00000 - "missing keyword"
    *Cause:
    *Action:
    0 rows deleted

    Erreur commençant à la ligne 18 de la commande :
    INSERT INTO D_FUNCTION
    SELECT NAME_FUNCTION,CREATE_DATE,UPDATE_DATE,LOGIN_USER,LOGIN_USER_UPDATE
    FROM T_DOUBLON_TEMP
    Erreur à la ligne de commande : 20, colonne : 7
    Rapport d'erreur :
    Erreur SQL : ORA-00942: table or view does not exist
    00942. 00000 - "table or view does not exist"
    *Cause:
    *Action:

    Erreur commençant à la ligne 22 de la commande :
    DROP TABLE T_DOUBLON_TEMP
    Rapport d'erreur :
    Erreur SQL : ORA-00942: table or view does not exist
    00942. 00000 - "table or view does not exist"
    *Cause:
    *Action:
    Je ne comprend pas, j'ai revérifier ma syntaxe avec mes sources (livre et cours) et je ne vois pas ce qu'il manque...

    Quelqu'un aurait-il une idée ?

    D'avance merci

  2. #2
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Tu ne peux pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select champ1,champ2....
    INTO <nom_de_table>
    Il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select champ1,champ2....
    INTO var1,var2....
    ou faire du SQL pur !
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  3. #3
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    SQL pur du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO T_DOUBLON_TEMP
    SELECT DISTINCT NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    FROM D_FUNCTION
    GROUP BY NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    HAVING COUNT(*) > 1;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    CREATE TABLE T_DOUBLON_TEMP AS 
    SELECT DISTINCT NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    FROM D_FUNCTION
    GROUP BY NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    HAVING COUNT(*) > 1;
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ou plus simplement en une seule requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DELETE FROM D_FUNCTION
     WHERE ROWID NOT IN (SELECT MIN(ROWID)
                           FROM D_FUNCTION
                       GROUP BY NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
                         HAVING count(*) > 1);

  5. #5
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Vachement plus simple ?
    Et puis, l'utilisation du ROWID par un débutant , est-ce bien raisonnable (je penchererais plutot par une utilisation de ROWNUM) ????
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Je dirais meme plus : Vachement plus juste vu la demande.
    Citation Envoyé par Bobette
    je souhaite les éliminer afin qu'il ne reste qu'un exemplaire de chaque ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    TMP@MINILHC >create table tmp as select mod(level,10) as n from dual connect by level<15;
    Table created.
    TMP@MINILHC >create table tmp2 as select distinct n from tmp group by n having count(*)>1;
     
    Table created.
     
    Elapsed: 00:00:00.29
    TMP@MINILHC >select * from tmp2;
     
             N
    ----------
             1
             2
             4
             3
    Il en manque quelques un la

    Edit:Ou faut enlever le having

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 55
    Points : 33
    Points
    33
    Par défaut
    Merci pour vos réponses !

    J'arrive bien a remplir ma table temporaire avec une seule ligne de ces fameux doublons (qui sont en fait NAME_FUNCTIOn='NOADMIN'), et cela me supprime toutes ces lignes de ma table D_FUNCTION.

    Mais, j'ai aussi le soucis d'avoir pour un meme LOGIN_USER, un NAME_FUNCTION qui peut etre egal a ADMIN et a NOADMIN.
    Auquel cas j'aimerai ne garder que la ligne avec ce NAME_FUNCTION='ADMIN'. (si mon user est admin, il n'a pas besoin d'etre noadmin egalement...)

    En fonction de ce que vous m'avez suggeré j'ai ainsi code ma requète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE TABLE T_DOUBLON_TEMP AS 
    SELECT DISTINCT NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    FROM D_FUNCTION
    GROUP BY NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    HAVING COUNT(*) > 1;
     
    DELETE
    FROM D_FUNCTION d 
    WHERE EXISTS( SELECT * FROM D_FUNCTION d2
    WHERE d.NAME_FUNCTION = d2.NAME_FUNCTION 
    AND d.LOGIN_USER= d2.LOGIN_USER HAVING COUNT(*) > 1);
     
    INSERT INTO D_FUNCTION
    SELECT NAME_FUNCTION,CREATE_DATE,UPDATE_DATE,LOGIN_USER,LOGIN_USER_UPDATE
    FROM T_DOUBLON_TEMP WHERE NOT IN(select * from D_FUNCTION d where d.NAME_FUNCTION = 'ADMIN');
     
    DROP TABLE T_DOUBLON_TEMP;
    Et il me reste une erreur, un missing expression, sur la partie du insert into
    Succès de l'élément CREATE TABLE.
    0 rows deleted

    Erreur commençant à la ligne 13 de la commande :
    INSERT INTO D_FUNCTION
    SELECT NAME_FUNCTION,CREATE_DATE,UPDATE_DATE,LOGIN_USER,LOGIN_USER_UPDATE
    FROM T_DOUBLON_TEMP WHERE NOT IN(select * from D_FUNCTION d where d.NAME_FUNCTION = 'ADMIN')
    Erreur à la ligne de commande : 15, colonne : 30
    Rapport d'erreur :
    Erreur SQL : ORA-00936: missing expression
    00936. 00000 - "missing expression"
    *Cause:
    *Action:
    Succès de l'élément DROP TABLE T_DOUBLON_TEMP.
    J'y suis presque, avez-vous une idée ?

    Merci

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 55
    Points : 33
    Points
    33
    Par défaut
    J'ai ma soluce !

    Avec cette requète tout fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE TABLE T_DOUBLON_TEMP AS 
    SELECT DISTINCT NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    FROM D_FUNCTION
    GROUP BY NAME_FUNCTION, CREATE_DATE, UPDATE_DATE, LOGIN_USER, LOGIN_USER_UPDATE
    HAVING COUNT(*) > 1;
     
    DELETE
    FROM D_FUNCTION d 
    WHERE EXISTS( SELECT * FROM D_FUNCTION d2
    WHERE d.NAME_FUNCTION = d2.NAME_FUNCTION 
    AND d.LOGIN_USER= d2.LOGIN_USER 
    GROUP BY NAME_FUNCTION,LOGIN_USER HAVING COUNT(*) > 1);
     
    INSERT INTO D_FUNCTION 
    SELECT NAME_FUNCTION,CREATE_DATE,UPDATE_DATE,LOGIN_USER,LOGIN_USER_UPDATE
    FROM T_DOUBLON_TEMP WHERE LOGIN_USER NOT IN(select LOGIN_USER from D_FUNCTION where NAME_FUNCTION ='ADMIN');
     
    DROP TABLE T_DOUBLON_TEMP;
    Encore merci pour votre aide Et bonne fin de semaine !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2013, 09h46
  2. Requête sur des doublons
    Par renaudjuif dans le forum Requêtes
    Réponses: 10
    Dernier message: 22/02/2010, 15h43
  3. problèmes de requêtes sur des vues
    Par krum dans le forum JPA
    Réponses: 0
    Dernier message: 23/06/2009, 10h48
  4. [MySQL] Problème de requête sur des dates
    Par dahu29 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2006, 13h08
  5. Recherche et tri sur des doublons XSLT
    Par MusSDev dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 01/06/2005, 09h27

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