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 :

Verifier si les données d'un champ d'une table s'incremente bien


Sujet :

Oracle

  1. #1
    der
    der est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 37
    Points : 34
    Points
    34
    Par défaut Verifier si les données d'un champ d'une table s'incremente bien
    Bonjour

    J'ai un soucis en tant que débutant sous Oracle qui est :

    J'ai une table qui contient un champ type NUMBER. Le but est de verifier si les données saisies s'incrementent bien.

    Par exemple :
    Je dois verifier si les données sont : 1,2, 3,4,5,6,7,8,9,10, .............99, 100,... => DONNEES OK
    Sinon, si j'ai 1,2,4,5,6,9,10, ...................... => DONNEES FAUSSES.

    Question : Existe t il une fonction ce genre de traitement
    Sinon, avez vous une solution SVP

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Il est possible d'écrire une requête qui le vérifie mais l'absence de trous n'est pas une tâche facile à atteindre!

    Dans l'exemple en bas, le premier cas, il y a un trou mais dans le deuxième, il n'y en a pas. si la seule ligne du résultat est 0 alors il n'y a pas de trous (l'hypothèse est que la série commence par 1 et s'incrémente par 1 aussi)

    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
    with t as
    (
      select level valeur
      from dual
      where level != 10
      connect by level <= 30
    )
    select distinct valeur - rank () over (order by valeur) diff
    from t
     
     
    DIFF                                                                                                                                
    ----                                                                                                                                
    1                                                                                                                                
    0                                                                                                                                
     
    2 rows selected
    with t as
    (
      select level valeur
      from dual
      connect by level <= 30
    )
    select distinct valeur - rank () over (order by valeur) diff
    from t
     
     
    DIFF                                                                                                                                
    ----                                                                                                                                
    0                                                                                                                                
     
    1 rows selected

  3. #3
    der
    der est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 37
    Points : 34
    Points
    34
    Par défaut
    Merci pour tout surtout cette aide precieuse.
    Pouvez vous me commenter le code ci-dessous SVP. Je veux juste bien comprendre.

    WITH t AS
    (
    SELECT level valeur
    FROM dual
    WHERE level != 10
    connect BY level <= 30
    )
    SELECT DISTINCT valeur - rank () over (ORDER BY valeur) diff
    FROM t



    Merci

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Bon je vais commencer par simplifier

    Supposons que la table s'appelle t et que la colonne s'appelle valeur alors la requête de vérification est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT valeur - rank () over (ORDER BY valeur) diff
    FROM t
    si le résultat de cette requête est une seule ligne ayant la valeur 0 (avec les hypothèses que j'ai signalées) alors il n'y a pas de trous dans la table. Sinon alors des trous existent dans la table.

    La clause WITH qui précédait était juste pour fabriquer dynamiquement une table avec les caractéristiques de test que je voulais. Pour voir ce qu'elle fait exécuter ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH t AS
    (
    SELECT level valeur
    FROM dual
    WHERE level != 10
    connect BY level <= 30
    )
    select * from t
    Elle génère dans ce cas là une "table" ayant les valeurs de 1 à 30 à l'exception de la valeur 10 (Donc un trou)

  5. #5
    der
    der est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 37
    Points : 34
    Points
    34
    Par défaut
    Merci pour ton aide

    Je vais le tester de ce pas.

    Merci encore une fois.

  6. #6
    der
    der est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 37
    Points : 34
    Points
    34
    Par défaut
    Merci beaucoup
    Ca marche !!!!
    Bonne journée

  7. #7
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    tu peux faire plus simple non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select sum(id), count(id), min(id),max(id) from table
    apres ca depend en quoi tu codes mais si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    max(id)-min(id) différent de count(id)
    alors pas la bonne incrémentation !
    (reste a vérifier si jamais la liste est de la forme [1,2,2,4])
    or la somme des n entiers à la suite c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n*(n-1)/2 = [count(id)+min(id)]*[count(id)+min(id)-1]/2
    si ce résultat est différent de sum(id) ce n'est pas bon !!!

    ( les formules sont à modifier légerement selon si tu pars de 0 ou de 1 ou d'autre part )

    Enfn je dis ca comme ca en l'air ....

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

Discussions similaires

  1. [AC-2003] modifier les données dans le champs d'une table en sql
    Par carlostropico dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 01/12/2009, 16h24
  2. Réponses: 16
    Dernier message: 14/06/2009, 22h12
  3. Réponses: 8
    Dernier message: 21/08/2007, 00h20
  4. [MySQL] Afficher toutes les données d'un champ dans une liste déroulante
    Par Touareg dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 19/03/2007, 12h42
  5. Afficher les données d'un champ sur une ligne
    Par white-angel dans le forum Access
    Réponses: 6
    Dernier message: 30/08/2006, 11h09

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