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

Requêtes MySQL Discussion :

Requête de détection de codes orphelins


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Requête de détection de codes orphelins
    Bonjour,
    J'ai une table avec des données comme ceci:
    code
    -----
    01.12
    01.12A
    01.13
    01.13Z
    01.14
    01.14B
    ...

    Je voudrais vérifier que je n'ai pas de code orphelin, c'est à dire savoir si j'aurais des lignes '00.00' qui ne seraient pas répétées avec une lettre finale '00.00A'
    Je n'arrive pas à écrire la clause WHERE qui me donnerait les codes orphelins.
    Je peux avoir 01.12, 01.12A, 01.12B, 01.12C mais je ne veux pas de partie numérique sans lettre.

    EDIT: J'ai fait un SELECT COUNT(*) FROM naf4 WHERE code LIKE '__.__' -- Résultat 615
    et SELECT COUNT(*) FROM naf4 WHERE code LIKE '__.___' -- Résultat 732

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 650
    Billets dans le blog
    10
    Par défaut
    bonjour

    une requête EXISTSavec une expression régulière REGEXPdevrait convenir

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 650
    Billets dans le blog
    10
    Par défaut
    Et même plus simple :

    Jeu d'essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with tab0(col0) as
        (select '00.00 '  union all
         select '00.00A'  union all
         select '11.11'   union all
         select '11.12'   union all
         select '11.12D'  union all
         select '11.12X'  union all
         select '21.15'   union all
         select '22.01'   union all
         select '22.04'   union all
         select '22.04B'
        )

    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 col0                   as Col0
         , length(trim(col0))     as Lng
         , substring(col0, 1, 5)  as Deb5
         , case when exists
              (select 1
               from tab0 S0
               where length(S0.col0)=6
                 and substring(trim(S0.col0), 1, 5)
                    =substring(trim(T0.col0), 1, 5)
              )
                     then 'bien'
                     else 'pas bien'
           end as truc
    from tab0 T0
    where length(trim(col0))=5
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Col0	Lng	Deb5	truc
    00.00 	5	00.00	bien
    11.11	5	11.11	pas bien
    11.12	5	11.12	bien
    21.15	5	21.15	pas bien
    22.01	5	22.01	pas bien
    22.04	5	22.04	bien
    Mais dans tous les cas, les perfs seront pourries

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    En partant de la proposition d'Escartefigue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select  ln5.col0                    as Col0
        ,   case when ln6.col0 is null 
                then 'pas bien'
                else 'bien'
            end                         as truc
    from    tab0    ln5
        left join
            tab0    ln6
            on  substring(ln6.col0, 1, 5)   = substring(ln5.col0, 1, 5)
            and length(trim(ln6.col0)) = 6
    where   length(trim(ln5.col0)) = 5
    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.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Bonjour,

    Je crois avoir à peu près compris vos codes. J'ai transposé le code d'escartfigues au cas de mes données comme ceci:
    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 code                   as Code
         , length(trim(code))     as Lng
         , substring(code, 1, 5)  as Deb5
         , case when exists
              (select 1
               from naf4 S0
               where length(S0.code)=6
                 and substring(trim(S0.code), 1, 5)
                    =substring(trim(T0.code), 1, 5)
              )
                     then 'bien'
                     else 'pas bien'
           end as truc
    from naf4 T0
    where length(trim(code))=5
    Jusque là tout fonctionne.
    J'ai modifié ensuite la clause where finale comme ceci: where length(trim(code))=5 and truc = 'pas bien'. Cet ajout provoque une erreur:
    Champ 'truc' inconnu dans where clause
    Je ne comprends pas parce que truc est bien défini.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Citation Envoyé par moimp Voir le message
    Je ne comprends pas parce que truc est bien défini.
    La colonne truc n'est pas définie au moment où la clause WHERE est évaluée.
    Il faudrait donc remplacer le nom de colonne truc par l'expression correspondante dans la clause WHERE.
    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.

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 957
    Par défaut
    Salut à tous.

    C'est bien compliqué ce que vous faites :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    --------------
    START TRANSACTION
    --------------
     
    --------------
    set session collation_connection = "latin1_general_ci"
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    (  `id`    integer unsigned NOT NULL auto_increment primary key,
       `val`   varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`val`) values
      ('00.0'),('00.0A'),
      ('00.2'),('00.2A'),
      ('00.5'),
      ('01.11'),
      ('01.12'),('01.12A'),('01.12X'),
      ('01.13'),('01.13Z'),
      ('01.14'),('01.14B'),
      ('01.15'),
      ('21.00'),
      ('22.01'),('22.04'),('22.04B')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+--------+
    | id | val    |
    +----+--------+
    |  1 | 00.0   |
    |  2 | 00.0A  |
    |  3 | 00.2   |
    |  4 | 00.2A  |
    |  5 | 00.5   |
    |  6 | 01.11  |
    |  7 | 01.12  |
    |  8 | 01.12A |
    |  9 | 01.12X |
    | 10 | 01.13  |
    | 11 | 01.13Z |
    | 12 | 01.14  |
    | 13 | 01.14B |
    | 14 | 01.15  |
    | 15 | 21.00  |
    | 16 | 22.01  |
    | 17 | 22.04  |
    | 18 | 22.04B |
    +----+--------+
    --------------
    select       REGEXP_SUBSTR(val,'[0-9\.]+')  as val,
           count(REGEXP_SUBSTR(val,'[0-9\.]+')) as nbre
    from `test`
    group by REGEXP_SUBSTR(val,'[0-9\.]+')
    having nbre = 1
    --------------
     
    +-------+------+
    | val   | nbre |
    +-------+------+
    | 00.5  |    1 |
    | 01.11 |    1 |
    | 01.15 |    1 |
    | 21.00 |    1 |
    | 22.01 |    1 |
    +-------+------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Je suis parti sur l'idée que la partie numérique avait une longueur quelconque.
    Et qu'éventuellement, elle se termine par une lettre ou pas.
    Le but est alors de supprimer cette lettre et de comptabiliser le nombre de fois que l'on rencontre la partie numérique.
    On retient que les lignes qui ont une seule occurrence.

    @+

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

Discussions similaires

  1. Executer une requête access depuis un code vbscript
    Par bennbenn dans le forum VBScript
    Réponses: 1
    Dernier message: 22/05/2008, 08h20
  2. copier une requête sql dans un code java
    Par Smix007 dans le forum Langage
    Réponses: 2
    Dernier message: 05/04/2008, 15h14
  3. Outils de détection de code mort
    Par maloups dans le forum JSF
    Réponses: 7
    Dernier message: 18/09/2007, 17h23
  4. Détection de code mort
    Par maloups dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 18/09/2007, 17h18
  5. Projet VB v6 : utilisation de requête SQL dans mon code
    Par MITCH31 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/10/2005, 15h02

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