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 :

Deux lignes avec même ID


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Par défaut Deux lignes avec même ID
    Bonjour à tous,

    J'ai un souci avec mes lignes. En effet, je me retrouve avec deux lignes qui ont le même id (pas primary key, c'est juste un nom).

    N'ayez pas peur, il n'y a pas grand chose à lire

    Voilà mon fichier de sortie :

    D;1772;1;1772;019A;;6411100;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;XXXX;;;;;;;;;;;;;;;;0;12
    D;1773;1;1773;019A;;7916000;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;XXXX;;;;;;;;;;;;;;;;0;12
    D;1854;1;1;019A;;R641000;;SOLDE 2009;-1;12;;;;CSN;;;;;;;;
    A;1;PAR;019_XXX_XXX;FLX;XXXX;;;;;;;;;;;;;;;;0;12

    ... // Des D et des A avec les D ayant la deuxième colonne incrémentée de 1 à chaque fois !

    D;1837;1;1837;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;049A;;;;;;;;;;;;;;;;0;12
    D;1838;1;1838;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;030A;;;;;;;;;;;;;;;;0;12
    D;1839;1;1839;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;103A;;;;;;;;;;;;;;;;0;12
    D;1840;1;1840;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;040A;;;;;;;;;;;;;;;;0;12
    D;1841;1;1841;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;097A;;;;;;;;;;;;;;;;0;12
    D;1842;1;1842;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;082A;;;;;;;;;;;;;;;;0;12
    D;1843;1;1843;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;300A;;;;;;;;;;;;;;;;0;12
    D;1844;1;1844;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;117A;;;;;;;;;;;;;;;;0;12
    D;1845;1;1845;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;077A;;;;;;;;;;;;;;;;0;12
    D;1846;1;1846;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;093A;;;;;;;;;;;;;;;;0;12
    D;1847;1;1847;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;122A;;;;;;;;;;;;;;;;0;12
    D;1848;1;1848;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;301A;;;;;;;;;;;;;;;;0;12
    D;1849;1;1849;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;107A;;;;;;;;;;;;;;;;0;12
    D;1850;1;1850;019A;;7068050;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;075A;;;;;;;;;;;;;;;;0;12
    D;1851;1;1851;019A;;7580000;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;XXXX;;;;;;;;;;;;;;;;0;12
    D;1852;1;1852;019A;;7670000;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;XXXX;;;;;;;;;;;;;;;;0;12
    D;1853;1;1853;019A;;7815000;;SOLDE 2009;-1;12;;;;FR1;;;;;;;;
    A;1;BUD;019_XXX_XXX;CAN;XXXX;;;;;;;;;;;;;;;;0;12
    D;1854;1;2;019A;;P781500;;SOLDE 2009;-1;12;;;;CSN;;;;;;;;
    A;1;PAR;019_XXX_XXX;FLX;XXXX;;;;;;;;;;;;;;;;0;12
    Je voudrais que mon deuxième id (1854) soit à 1855 du coup.
    J'utilisais la requête 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
    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
     
    INSERT INTO #ZBALANCE
    SELECT
    	'D',
    	ISNULL((SELECT MAX(CAST(COL2 AS INT)) + 1
    			FROM #ZBALANCE
    			WHERE COL1 = 'D')
    		   ,'') AS COL2,
    	BAL.COL3,
    	ISNULL((SELECT MAX(CAST(COL4 AS INT)) + 1
    			FROM #ZBALANCE
    			WHERE COL1 = 'D')
    		   ,'') AS COL4,
    	BAL.COL5,
    	BAL.COL6,
    	TC.CSN_X3 AS COL7,
    	ISNULL(TC.BPS_X3, '') AS COL8,
    	BAL.COL9,
    	BAL.COL10,
    	BAL.COL11,
    	BAL.COL12,
    	BAL.COL13,
    	BAL.COL14,
    	'CSN' AS COL15,
    	BAL.COL16,
    	BAL.COL17,
    	BAL.COL18,
    	BAL.COL19,
    	BAL.COL20,
    	BAL.COL21,
    	BAL.COL22,
    	BAL.COL23,
    	BAL.COL24,
    	BAL.COL25,
    	ISNULL((SELECT MAX(CAST(COL2 AS INT)) + 1
    			FROM #ZBALANCE
    			WHERE COL1 = 'D')
    		   ,'') AS COL26
    FROM #ZBALANCE BAL 
    INNER JOIN AT_T TC ON TC.GENE_OLD = BAL.COL24
    WHERE TC.FR1_X3 <> '' 
    	AND TC.CSN_X3 <> ''
    	AND BAL.COL1 = 'D'
    Mon
    ISNULL((SELECT MAX(CAST(COL2 AS INT)) + 1
    FROM #ZBALANCE
    WHERE COL1 = 'D')
    ,'')
    N'incrémente pas pour chaque ligne insérée. Il fait le select puis garde cette valeur à chaque fois. Que puis-je utiliser pour cela fonctionne ?

    Merci d'avance.

    PS : je suis sous Sql Server Management Studio 2008 !

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Poste le DDL de création de la table car là c'est un peu nébuleux.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Pê 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
    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
    INSERT INTO #ZBALANCE
    SELECT
    	'D',
    	ISNULL((SELECT MAX(CAST(COL2 AS INT)) 			FROM #ZBALANCE
    			WHERE COL1 = 'D')
    		   ,'') + ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS COL2,
    	BAL.COL3,
    	ISNULL((SELECT MAX(CAST(COL4 AS INT)) + 1
    			FROM #ZBALANCE
    			WHERE COL1 = 'D')
    		   ,'') AS COL4,
    	BAL.COL5,
    	BAL.COL6,
    	TC.CSN_X3 AS COL7,
    	ISNULL(TC.BPS_X3, '') AS COL8,
    	BAL.COL9,
    	BAL.COL10,
    	BAL.COL11,
    	BAL.COL12,
    	BAL.COL13,
    	BAL.COL14,
    	'CSN' AS COL15,
    	BAL.COL16,
    	BAL.COL17,
    	BAL.COL18,
    	BAL.COL19,
    	BAL.COL20,
    	BAL.COL21,
    	BAL.COL22,
    	BAL.COL23,
    	BAL.COL24,
    	BAL.COL25,
    	ISNULL((SELECT MAX(CAST(COL2 AS INT)) + 1
    			FROM #ZBALANCE
    			WHERE COL1 = 'D')
    		   ,'') AS COL26
    FROM #ZBALANCE BAL 
    INNER JOIN AT_T TC ON TC.GENE_OLD = BAL.COL24
    WHERE TC.FR1_X3 <> '' 
    	AND TC.CSN_X3 <> ''
    	AND BAL.COL1 = 'D'

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Billets dans le blog
    8
    Par défaut
    La solution proposée par Sergejack me parait bonne.

    Il faut juste savoir et être conscient du fait que lorsque la clause ORDER BY de la fonction fenêtrée ROW_NUMBER est une constante, exemple (select 1) ou (select ‘a’) , (select null) etc.., les numéros de séquences générées ne sont pas déterministes c.à.d. d’une exécution à l’autre la séquence générée peut être différente.
    En effet, Il y a beaucoup de situations où, pour des raisons diverses, les plans peuvent changer dans le l’Optimiseur. Ce dernier peut avoir des centaines (voire des milliers) de choix potentiels, possibles, de plans. Et, chacun de ces plans, lorsqu’il est utilisé, peut générer un tri différent (du moment où vous ne précisez pas explicitement l’ORDER BY sur les colonnes).
    Conclusion : Il est toujours préférable de préciser un order by sur les colonnes.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    … ROW_NUMBER() OVER (ORDER BY BAL.COL2 )

Discussions similaires

  1. Deux packages avec même id dans syspackages
    Par serge0934 dans le forum Outils
    Réponses: 0
    Dernier message: 19/03/2012, 11h53
  2. [PHP 5.1] Récupérer deux champs avec même nom
    Par Federico_muy_bien dans le forum Langage
    Réponses: 10
    Dernier message: 05/08/2010, 17h42
  3. Titre sur deux lignes avec \markboth
    Par phy4me dans le forum Mise en forme
    Réponses: 3
    Dernier message: 12/12/2007, 17h07
  4. Permuter deux ligne avec un DataGridview
    Par glycerine dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/12/2007, 21h18
  5. [Dates] sélectionner les lignes avec même mois
    Par carelha dans le forum Langage
    Réponses: 2
    Dernier message: 04/12/2006, 15h08

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