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 :

Problème de filtre avec Minus [11g]


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    Par défaut Problème de filtre avec Minus
    Bonjour,

    Je vous écrit car j'ai l'impression d'avoir perdu mon cerveau...
    J'ai une requête qui compare les fichiers dans deux bases différentes et les compares afin de n'afficher que les fichiers manquants dans la base de données numéro deux
    Voici 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
    select noS, listagg(code, ';') WITHIN group (order by code) as liste from (
      WITH RB1 AS (select Y.code code, to_char(Y.date_real,'DD/MM/YYYY') dte, Z.act_id as noS, coalesce(y.nb_actes,1) as nbact
      from act@LIENUN Y, p_t@LIENUN Z
      where Y.visit_id = Z.visit_id and date_real >= '01/01/2018'
      and Z.act_id = '213364558'),
      RB2 AS (  select  code_acte||phase_acte||id_activite as code, to_char(heure_acte,'DD/MM/YYYY') as dte, no_s
      from t_a@LIENDEUX A, t_d@LIENDEUX B, t_s@LIENDEUX C
      where A.id_s = C.id_s
      and date_acte >= '01/01/2018'
      and A.id_acte = B.id_acte
      and no_s = '213364558')
      SELECT noS, code ||'-'|| dte ||'x'|| sum(nbact) as code FROM rb1 GROUP BY code, dte, noS
      MINUS
      SELECT no_s,code ||'-'|| dte ||'x'|| COUNT(*) as code FROM rb2 GROUP BY code, dte, no_s)
      group by noS;
    J'ai des résultats du style :

    Base 1 :
    AAAA01-16/10/2018 x5
    AAAA02-16/10/2018 x2
    BBBB01-16/10/2018 x3

    Base 2
    AAAA01-16/10/2018 x3
    AAAA02-16/10/2018 x4
    BBBB01-16/10/2018 x3

    Ma requête ne devrait donc me retourner seulement le 'AAAA01' parce que c'est le seul code fichier dont il manque des exemplaires dans la base 2.
    Le problème est qu'avec le minus, je me retrouve aussi avec le 'AAAA02' alors que, même si il n'est pas dans le même nombre, il n'est pas manquant dans la base 2
    Je ne vois pas comment faire pour n'avoir que le 'AAAA01' en résultat...

    Bisous

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    MINUS traite la ligne complète, il ne sait pas si dans ta requête, tu as mis un identifiant en 1er, et une valeur en 2ème, ou l'inverse.

    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select COL1, COL2 from maTable
    minus
    select COL1, COL2 from TableFiltre
    il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select COL1 , COL2 from maTable
    Where COL1 not in ( select col1 from TableFiltre)
     
    ou bien :
    Select COL1 , COL2 from maTable T
    Where not exists ( select 1 from TableFiltre TF where TF.col1 = T.col1)
    Selon les cas, la version la plus perfrmante sera la 1ère ou bien la 2ème.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    Par défaut
    Bonjour,

    Merci pour la réponse. Pour la solution dite, le problème est que le not in me retournera toujours le AAAA02x2 comme il n'est pas comme ça dans la base de données 2
    Et justement, je ne veux pas qu'il me le renvoie parce que ce fichier est bien présent dans la base 2, il l'est même trop présent

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Le not In fait une recherche sur la table n°2, en recherchant uniquement le code produit : AAAA02
    Si ce code est présent dans la table n°2 (peu importe la suite de l'enregistrement), on fait une certaine action, et s'il n'est pas présent, une autre action.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    Par défaut
    Je me trompe peut-être mais dans ce cas, le problème est que la requête ne gérera plus le nombre de fichiers. Et si un fichier est présent 2 fois dans la base une et qu'une fois dans la base 2, alors cela ne remontera pas par la requête...
    J'ai l'impression de m'être perdu tout seul

  6. #6
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Si Base 1 est la "source" a comparer à Base 2, à première vue ce que je ferais est de faire un compte par code fichier sur Base 1, outer join un compte par code fichier sur Base 2.
    Puis dans un second temps, en utilisant le code ayant servi à la premiére étape dans une inline view (dsl, je n'ai que ce terme) par exemple, je ne remonterais que les enregistrements dont les comptes sur Base 2 sont inférieurs aux comptes sur Base 1.
    Donc par exemple - à l'arrache - un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT c.*
      FROM (SELECT a.code_fichier, a.ct_base_1, b.ct_base_2
              FROM (  SELECT code_fichier, COUNT (1) ct_base_1
                        FROM base_1
                    GROUP BY code_fichier) a
                 , (  SELECT code_fichier, COUNT (1) ct_base_2
                        FROM base_2
                    GROUP BY code_fichier) b
             WHERE a.code_fichier = b.code_fichier(+)) c
     WHERE c.ct_base_1 < c.ct_base_2 OR (c.ct_base_1 IS NOT NULL AND c.ct_base_2 IS NULL)
     /* la partie du "OR" est a voir en fonction du besoin, pas sur que cela corresponde a ta situation
     mais j'aurais tendance a penser qu'il faut tester aussi le cas ou base 2 ne remonte aucun
     résultat pour un code fichier, alors qu'il existe dans base 1 */
    Qui devrait te permettre de voir les résultats, regarder si ce qui sort est bien ce que tu espères et puis ensuite optimiser (si besoin) ce type de code un peu "rugueux".

    @+
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    Par défaut
    Merci beaucoup sunchaser,

    J'ai essayé pour deux cas et ça fonctionne, j'avais pensé à un algo de ce type mais je dois avouer que je n'avais pas réussi à voir comment le mettre en place...

    Je laisse la discussion en non résolu jusqu'à demain au cas où mais je pense que c'est bon

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/09/2016, 12h27
  2. Problème de filtres avec JSF
    Par concas dans le forum JSF
    Réponses: 2
    Dernier message: 26/08/2016, 12h32
  3. [Lazarus] Problème de filtre avec SQLQuery et numérique
    Par Patrick25300 dans le forum Lazarus
    Réponses: 6
    Dernier message: 30/11/2015, 18h03
  4. [QtGui] Problème de filtres avec QFileDialog
    Par Renoct dans le forum PyQt
    Réponses: 1
    Dernier message: 22/12/2011, 19h45

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