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

MS SQL Server Discussion :

detecter les trous dans une serie entière


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut detecter les trous dans une serie entière
    Bonjour, dans une table, j'ai un champ contenant le Numéro d'un document qui est unique, ce numéro est une série 1,2, 3, 4, 5....., qui s'incrémente avec 1, je dois faire une requete sur cette table pour detecter les trou dans cette colonne, j'ai pas une idée, merci de m'aider

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Les réponses peuvent différer suivant votre version de SQL Server.
    Quelle version utilisez-vous ? 2000, 2005 ou 2008 ?

    @++

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    version 2005

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Je considère la table suivante :

    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
    CREATE TABLE TEST
    (
    	val INT
    )
    GO
     
    INSERT INTO dbo.TEST VALUES (1)
    INSERT INTO dbo.TEST VALUES (2)
    INSERT INTO dbo.TEST VALUES (3)
    INSERT INTO dbo.TEST VALUES (4)
    INSERT INTO dbo.TEST VALUES (7)
    INSERT INTO dbo.TEST VALUES (9)
    INSERT INTO dbo.TEST VALUES (10)
    INSERT INTO dbo.TEST VALUES (11)
    INSERT INTO dbo.TEST VALUES (15)
    La requête serait :

    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
    WITH
    	CTE AS
    	(
    		SELECT MIN(val) AS minVal,
    				MAX(val) AS maxVal
    		FROM dbo.TEST
    	),
    	CTE_LISTE_VAL AS
    	(
    			SELECT minVal
    			FROM CTE
    		UNION ALL
    			SELECT CTE_LISTE_VAL.minVal + 1
    			FROM CTE_LISTE_VAL
    			CROSS JOIN  CTE
    			WHERE CTE_LISTE_VAL.minVal < CTE.maxVal
    	)
    SELECT C.minVal AS val
    FROM CTE_LISTE_VAL AS C
    LEFT JOIN dbo.TEST AS T
    	ON C.minVal = T.val
    WHERE T.val IS NULL
    Et retourne :

    val
    ---
    5
    6
    8
    12
    13
    14
    @++

  5. #5
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    Merci pour la reponse, pourriez vous m'expliquer ce que vous avez fait ?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    En gros, il a reconstruit un listing d'id dense entre la plus petite valeur et la plus grande valeur de votre table, a fait une jointure externe dessus et n'a gardé que les entrées sans correspondances.

    Bon je pinaille, mais je pense que le With pouvait s'écrire un peu plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH CTE_LISTE_VAL (minVal, maxVal) AS
    (
    SELECT MIN(val), MAX(val)
      FROM dbo.TEST
     UNION ALL
    SELECT minVal + 1, maxVal
      FROM CTE_LISTE_VAL
     WHERE minVal < maxVal
    )

Discussions similaires

  1. Réponses: 14
    Dernier message: 18/02/2014, 17h27
  2. trous dans une serie de date
    Par wuging dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/09/2010, 21h48
  3. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  4. Les trous dans les clés primaires d'une base de données ?
    Par dymezac dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 27/09/2006, 09h22
  5. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39

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