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

Développement SQL Server Discussion :

Recherche de numéro n'existant pas dans une plage


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Points : 64
    Points
    64
    Par défaut Recherche de numéro n'existant pas dans une plage
    Bonjour,
    je cherche à faire une requete qui me retourne une suite de nombre n'existant pas dans la colonne de ma table dans un interval fourni.

    Genre si j'ai la colonne "Nr" qui comporte ces valeurs :
    1
    2
    4
    5
    6
    9

    j'aimerais pouvoir trouver les valeurs "inexistantes" suivantes :
    3
    7
    8

    si ma recherche se fait sur l'interval 1 à 10.

    Merci pour votre aide.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    Déjà répondu des dizaines de fois. Cherchez bien dans le forum.

    1) si performances demandées=> table de numéro et requête EXCEPT
    2) si pas performances demandées => requête récursive.

    Exemple (2) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE MaTable (Nr INT);
     
    INSERT INTO MaTable VALUES (1), (2), (4), (5), (6), (9);
    -- solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH T_NUM AS
    (SELECT 1 AS N
     UNION ALL
     SELECT N + 1 
     FROM   T_NUM
     WHERE  N + 1 <= 100)
    SELECT N
    FROM   T_NUM
    WHERE  N NOT IN (SELECT Nr FROM MaTable)
      AND  N BETWEEN (SELECT Min(Nr) FROM MaTable)
                 AND (SELECT Max(Nr) FROM MaTable);
    A +

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Points : 64
    Points
    64
    Par défaut
    Merci pour votre réponse, super rapide !

    J'ai trouvé ceci avec vos indications :
    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
    -- création de la table :
    CREATE TABLE T_NUM (I INT)
     
    -- population de la table
    INSERT INTO T_NUM VALUES (0)
    INSERT INTO T_NUM VALUES (1)
    INSERT INTO T_NUM VALUES (2)
    INSERT INTO T_NUM VALUES (3)
    INSERT INTO T_NUM VALUES (4)
    INSERT INTO T_NUM VALUES (5)
    INSERT INTO T_NUM VALUES (6)
    INSERT INTO T_NUM VALUES (7)
    INSERT INTO T_NUM VALUES (8)
    INSERT INTO T_NUM VALUES (9)
     
    INSERT INTO T_NUM
    SELECT T1.I + T2.I * 10 + T3.I * 100 + T4.I * 1000 + T5.I * 10000
    FROM   T_NUM T1
           CROSS JOIN T_NUM T2
           CROSS JOIN T_NUM T3
           CROSS JOIN T_NUM T4
           CROSS JOIN T_NUM T5
    WHERE  T1.I + T2.I * 10 + T3.I * 100 + T4.I * 1000 + T5.I * 10000 > 9
     
    -- la requête devient triviale :
     
    SELECT I
    FROM   T_NUM N
           LEFT OUTER JOIN MaTable T
                ON N.I = T.MaColonne
    WHERE N BETWEEN (SELECT MIN(MaColonne) FROM MaTable)
                AND (SELECT MAX(MaColonne) FROM MaTable)
    Malheureusement la requête de population de 10 à 99999 ne fonctionne pas.
    Le serveur SQL me retourne une erreur disant qu'il y a une erreur dans la clause "SELECT".

    Pouvez-vous m'aider ?

    Merci d'avance.


    Source : http://www.developpez.net/forums/d22...nquante-serie/

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    postez le message d'erreur !

    A +

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Points : 64
    Points
    64
    Par défaut
    Le message d'erreur est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Il n'y a pas de nom de champ destination dans l'instruction INSERT INTO (T1.I + T2.I*10....)
    Ensuite j'ai modifié la requête comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO T_NUM (I)
    SELECT T1.I + T2.I * 10 + T3.I * 100 + T4.I * 1000 + T5.I * 10000
    .....
    .....
    et maintenant le message d'erreur est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur de syntaxe dans la clause FROM
    Merci de votre aide...

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Quelle est votre version de SQL-Server ?

    Refaites un copier-coller intégral de votre requête, ce que vous avez déjà posté fonctionne sous 2005 :
    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
    -- création de la table :
    CREATE TABLE T_NUM (I INT)
    -- Commande(s) réussie(s).
     
    -- population de la table
    INSERT INTO T_NUM VALUES (0)
    -- (1 ligne(s) affectée(s))
    INSERT INTO T_NUM VALUES (1)
    -- (1 ligne(s) affectée(s))
    INSERT INTO T_NUM VALUES (2)
    -- (1 ligne(s) affectée(s))
    INSERT INTO T_NUM VALUES (3)
    -- (1 ligne(s) affectée(s))
    INSERT INTO T_NUM VALUES (4)
    -- (1 ligne(s) affectée(s))
    INSERT INTO T_NUM VALUES (5)
    -- (1 ligne(s) affectée(s))
    INSERT INTO T_NUM VALUES (6)
    -- (1 ligne(s) affectée(s))
    INSERT INTO T_NUM VALUES (7)
    -- (1 ligne(s) affectée(s))
    INSERT INTO T_NUM VALUES (8)
    -- (1 ligne(s) affectée(s))
    INSERT INTO T_NUM VALUES (9)
    -- (1 ligne(s) affectée(s)) 
     
    INSERT INTO T_NUM
    SELECT T1.I + T2.I * 10 + T3.I * 100 + T4.I * 1000 + T5.I * 10000
    FROM   T_NUM T1
           CROSS JOIN T_NUM T2
           CROSS JOIN T_NUM T3
           CROSS JOIN T_NUM T4
           CROSS JOIN T_NUM T5
    WHERE  T1.I + T2.I * 10 + T3.I * 100 + T4.I * 1000 + T5.I * 10000 > 9
    -- (99990 ligne(s) affectée(s))

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2002
    Messages : 89
    Points : 64
    Points
    64
    Par défaut
    C'est SQL Server 2005 Standard Edition SP1...

    Si je fais un copier/coller de tous le script SQL, il plante sur la 2e ligne avec le message d'erreur suivant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur de syntaxe dans la clause INSERT INTO
    Si je veux faire la population des 10 premières valeurs, je dois le faire ligne par ligne...
    Je n'y comprend plus rien...

Discussions similaires

  1. Trouver valeurs d'une table n'existant pas dans une autre table
    Par aliasjcdenton dans le forum Langage SQL
    Réponses: 7
    Dernier message: 13/10/2011, 10h41
  2. Réponses: 5
    Dernier message: 27/04/2010, 14h55
  3. Réponses: 2
    Dernier message: 29/09/2009, 15h33
  4. Réponses: 3
    Dernier message: 09/05/2006, 17h21
  5. Réponses: 8
    Dernier message: 26/01/2006, 14h47

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