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 :

[SQL] DELETE avec jointures


Sujet :

MS SQL Server

  1. #1
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut [SQL] DELETE avec jointures
    Bonjour à toutes et à tous,

    J'ai un petit souci : lorsque je fais un SELECT, la requête ci-dessous fonctionne correctement.
    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
    SELECT FOND.ID_FUNDS as 'FOND', 
    		ANNEE_FOND.ID_YEAR AS 'ANNEE', 
    		INVEST.ID_INVESTMENT AS 'INVEST', 
    		LISTING.ID_LISTING AS 'LISTING', 
    		EXPOSURE.ID_EXPOSURE AS 'EXPOSURE',
    		EXPOTYPE.ID_EXPOSURE_TYPE AS 'EXPO TYPE',
    		DERIV.ID_DERIVATIVES AS 'DERIV',
    		DERIVTYPE.ID_DERIVATIVES_TYPE AS 'DERIV TYPE',
    		UNDER.ID_UNDERLYING AS 'UNDER',
    		UNDERTYPE.ID_UNDERLYING_TYPE AS 'UNDER TYPE',
    		SHORT.ID_SHORT_LONG AS 'SHORT',
    		SHORTTYPE.ID_SHORT_LONG_TYPE AS 'SHORT TYPE',
    		PUT.ID_PUT_CALL AS 'PUT CALL',
    		PUTTYPE.ID_PUT_CALL_TYPE AS 'PUT CALL TYPE'
    FROM	
    	(((((((((((((COM_USER.FUNDS AS FOND LEFT JOIN COM_USER.FUNDS_YEAR AS ANNEE_FOND ON FOND.ID_FUNDS = ANNEE_FOND.ID_FUNDS)
    		LEFT JOIN COM_USER.INVESTMENT AS INVEST ON ANNEE_FOND.ID_YEAR = INVEST.ID_YEAR)
    		LEFT JOIN COM_USER.LISTING_STATUS AS LISTING ON INVEST.ID_INVESTMENT = LISTING.ID_INVESTMENT)
    		LEFT JOIN COM_USER.EXPOSURE AS EXPOSURE ON LISTING.ID_LISTING = EXPOSURE.ID_LISTING) 
    		LEFT JOIN COM_USER.EXPOSURE_TYPE AS EXPOTYPE ON EXPOSURE.ID_EXPOSURE_TYPE = EXPOTYPE.ID_EXPOSURE_TYPE)
    		LEFT JOIN COM_USER.DERIVATIVES AS DERIV ON EXPOSURE.ID_EXPOSURE = DERIV.ID_EXPOSURE)
    		LEFT JOIN COM_USER.DERIVATIVES_TYPE AS DERIVTYPE 
    			ON (EXPOTYPE.ID_EXPOSURE_TYPE = DERIVTYPE.ID_EXPOSURE_TYPE 
    					AND DERIV.ID_DERIVATIVES_TYPE = DERIVTYPE.ID_DERIVATIVES_TYPE))
    		LEFT JOIN COM_USER.UNDERLYING AS UNDER ON DERIV.ID_DERIVATIVES = UNDER.ID_DERIVATIVES)
    		LEFT JOIN COM_USER.UNDERLYING_TYPE AS UNDERTYPE ON UNDERTYPE.ID_UNDERLYING_TYPE = UNDER.ID_UNDERLYING_TYPE)
    		LEFT JOIN COM_USER.SHORT_LONG AS SHORT ON UNDER.ID_UNDERLYING = SHORT.ID_UNDERLYING)
    		LEFT JOIN COM_USER.SHORT_LONG_TYPE AS SHORTTYPE
    			ON (SHORT.ID_SHORT_LONG_TYPE = SHORTTYPE.ID_SHORT_LONG_TYPE 
    					AND SHORTTYPE.ID_UNDERLYING_TYPE = UNDERTYPE.ID_UNDERLYING_TYPE))
    		LEFT JOIN COM_USER.PUT_CALL_TYPE AS PUTTYPE  
    			ON SHORTTYPE.ID_SHORT_LONG_TYPE = PUTTYPE.ID_SHORT_LONG_TYPE))
    		LEFT JOIN COM_USER.PUT_CALL AS PUT
    			ON (SHORT.ID_SHORT_LONG = PUT.ID_SHORT_LONG 
    					AND PUTTYPE.ID_PUT_CALL_TYPE = PUT.ID_PUT_CALL_TYPE)
     
     
    WHERE FOND.ID_FUNDS = @NUM_FOND 
    		AND FOND.ID_FUNDS = ANNEE_FOND.ID_FUNDS 
    		AND ANNEE_FOND.ID_YEAR = (SELECT ID_YEAR 
    									FROM COM_USER.FUNDS_YEAR 
    									WHERE ID_FUNDS = @NUM_FOND 
    										AND ANNEE = @NUM_ANNEE)
    Je voudrais maintenant transformer ce SELECT en un DELETE mais je ne sais pas comment faire ....
    Si quelqu'un a une idée ...

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Par défaut
    Il suffit de faire un Delete From, le contenu de ton FROM et mettre ensuite ton WHERE

  3. #3
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 288
    Par défaut
    Le problème est que SQL ne permet pas d'effectuer des delete avec des jointures.

    Cependant, lors de la création de ta table, si tu as bien renseigné tes foreign key, tu peux effectuer des DELETE CASCADE, c'est à dire que lorsque l'information 'parente" est supprimée, toutes les lignes qui l'avait comme référence seront supprimées elles aussi

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    C'est ce à quoi j'ai pensé :
    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
    DELETE
    FROM	
    	(((((((((((((COM_USER.FUNDS AS FOND LEFT JOIN COM_USER.FUNDS_YEAR AS ANNEE_FOND ON FOND.ID_FUNDS = ANNEE_FOND.ID_FUNDS)
    		LEFT JOIN COM_USER.INVESTMENT AS INVEST ON ANNEE_FOND.ID_YEAR = INVEST.ID_YEAR)
    		LEFT JOIN COM_USER.LISTING_STATUS AS LISTING ON INVEST.ID_INVESTMENT = LISTING.ID_INVESTMENT)
    		LEFT JOIN COM_USER.EXPOSURE AS EXPOSURE ON LISTING.ID_LISTING = EXPOSURE.ID_LISTING) 
    		LEFT JOIN COM_USER.EXPOSURE_TYPE AS EXPOTYPE ON EXPOSURE.ID_EXPOSURE_TYPE = EXPOTYPE.ID_EXPOSURE_TYPE)
    		LEFT JOIN COM_USER.DERIVATIVES AS DERIV ON EXPOSURE.ID_EXPOSURE = DERIV.ID_EXPOSURE)
    		LEFT JOIN COM_USER.DERIVATIVES_TYPE AS DERIVTYPE 
    			ON (EXPOTYPE.ID_EXPOSURE_TYPE = DERIVTYPE.ID_EXPOSURE_TYPE 
    					AND DERIV.ID_DERIVATIVES_TYPE = DERIVTYPE.ID_DERIVATIVES_TYPE))
    		LEFT JOIN COM_USER.UNDERLYING AS UNDER ON DERIV.ID_DERIVATIVES = UNDER.ID_DERIVATIVES)
    		LEFT JOIN COM_USER.UNDERLYING_TYPE AS UNDERTYPE ON UNDERTYPE.ID_UNDERLYING_TYPE = UNDER.ID_UNDERLYING_TYPE)
    		LEFT JOIN COM_USER.SHORT_LONG AS SHORT ON UNDER.ID_UNDERLYING = SHORT.ID_UNDERLYING)
    		LEFT JOIN COM_USER.SHORT_LONG_TYPE AS SHORTTYPE
    			ON (SHORT.ID_SHORT_LONG_TYPE = SHORTTYPE.ID_SHORT_LONG_TYPE 
    					AND SHORTTYPE.ID_UNDERLYING_TYPE = UNDERTYPE.ID_UNDERLYING_TYPE))
    		LEFT JOIN COM_USER.PUT_CALL_TYPE AS PUTTYPE  
    			ON SHORTTYPE.ID_SHORT_LONG_TYPE = PUTTYPE.ID_SHORT_LONG_TYPE))
    		LEFT JOIN COM_USER.PUT_CALL AS PUT
    			ON (SHORT.ID_SHORT_LONG = PUT.ID_SHORT_LONG 
    					AND PUTTYPE.ID_PUT_CALL_TYPE = PUT.ID_PUT_CALL_TYPE)
    WHERE FOND.ID_FUNDS = @NUM_FOND 
    		AND FOND.ID_FUNDS = ANNEE_FOND.ID_FUNDS 
    		AND ANNEE_FOND.ID_YEAR = (SELECT ID_YEAR 
    									FROM COM_USER.FUNDS_YEAR 
    									WHERE ID_FUNDS = @NUM_FOND 
    										AND ANNEE = @NUM_ANNEE)
    Mais voilà,
    En faisant cela j'obtiens les erreurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Msg 170, Level 15, State 1, Procedure SUPP_YEAR_OF_FUND, Line 33
    Line 33: Incorrect syntax near '('.
    Msg 170, Level 15, State 1, Procedure SUPP_YEAR_OF_FUND, Line 33
    Line 33: Incorrect syntax near 'COM_USER'.
    Line33 représente la première ligne de mon FROM.

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    Citation Envoyé par DroP Voir le message
    tu peux effectuer des DELETE CASCADE, c'est à dire que lorsque l'information 'parente" est supprimée, toutes les lignes qui l'avait comme référence seront supprimées elles aussi
    -> Cela signifie-t-il, que je n'ai besoin de vérifier qu'un seul ID et qu'il supprimerait automatiquement les ID dépendants ???

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 132
    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 132
    Par défaut
    Citation Envoyé par tazmania Voir le message
    Il suffit de faire un Delete From, le contenu de ton FROM et mettre ensuite ton WHERE
    Ce serait tellement simple si ça fonctionnait comme ça
    Comment le SGBD déterminera-t-il la table dans laquelle effectuer la suppression ?

    Pour supprimer une ligne d'une table, il faut pouvoir l'identifier de manière sure pour ne pas risquer de surprise désagréable.
    Le plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DELETE FROM matable
    WHERE id IN (SELECT id
                      FROM marequête
                     )
    ;
    Par ailleurs, en précisant le SGBD que vous utilisez et sa version, les réponses proposées seront adaptées aux spécificités et limitations de celui-ci.
    Conseils à lire avant de poster sur ce forum
    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 très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    Bonjour,

    J'utiliser SQL-SERVER 2005 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Microsoft SQL Server Management Studio		9.00.1399.00
    Microsoft Analysis Services Client Tools	2005.090.1399.00
    Microsoft Data Access Components (MDAC)		2000.085.1117.00 (xpsp_sp2_rtm.040803-2158)
    Microsoft MSXML					2.6 3.0 4.0 5.0 6.0 
    Microsoft Internet Explorer			7.0.5730.11
    Microsoft .NET Framework			2.0.50727.832
    Operating System				5.1.2600

  8. #8
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    J'ai fini par adopter la technique 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
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    -- ====================================================================== --
    -- Author:		ROMBEAU Jonathan										  --
    -- Create date: 05 SEPTEMBER 2007										  --
    -- Description:	Suppression des records pour une année concernant un fond --
    -- ====================================================================== --
     
    USE DEV_COMMISION -- On choisi la base de données à utiliser
     
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE PROCEDURE SUPPRESS_YEAR_OF_FUND
    	-- Add the parameters for the stored procedure here
    	@NUM_FOND INT = 0, -- CONTIENT L'ID DU FOND
    	@NUM_ANNEE INT = 0 -- CONTIENT L'ANNEE QUE L'ON VEUT SUPPRIMER
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
        IF @NUM_ANNEE > 0 AND @NUM_FOND > 0 --  ON VERIFIE QUE L'ANNEE ET L'ID DU FOND SONT DONNES
    		BEGIN 
    			-- DECLARATION DES VARIABLES
    			DECLARE @IDFOND AS BIGINT
    			DECLARE @IDYEAR AS BIGINT
    			DECLARE @IDINVEST AS BIGINT
    			DECLARE @IDLIST AS BIGINT
    			DECLARE @IDEXPO AS BIGINT
    			DECLARE @IDEXPOTYPE AS BIGINT
    			DECLARE @IDDERIV AS BIGINT
    			DECLARE @IDDERIVTYPE AS BIGINT
    			DECLARE @IDUNDER AS BIGINT
    			DECLARE @IDUNDERTYPE AS BIGINT
    			DECLARE @IDSHORT AS BIGINT
    			DECLARE @IDSHORTTYPE AS BIGINT
    			DECLARE @IDPUT AS BIGINT
    			DECLARE @IDPUTTYPE AS BIGINT
     
    			DECLARE @ERREURS INT -- VARIABLE POUR LES ERREURS
    			SET @ERREURS = 0 -- INTIALISATION A ZERO
     
    			-- OUVERTURE D'UN CURSEUR
    			DECLARE REC1 CURSOR FOR
    					SELECT FOND.ID_FUNDS as 'FOND', 
    						ANNEE_FOND.ID_YEAR AS 'ANNEE', 
    						INVEST.ID_INVESTMENT AS 'INVEST', 
    						LISTING.ID_LISTING AS 'LISTING', 
    						EXPOSURE.ID_EXPOSURE AS 'EXPOSURE',
    						EXPOTYPE.ID_EXPOSURE_TYPE AS 'EXPO TYPE',
    						DERIV.ID_DERIVATIVES AS 'DERIV',
    						DERIVTYPE.ID_DERIVATIVES_TYPE AS 'DERIV TYPE',
    						UNDER.ID_UNDERLYING AS 'UNDER',
    						UNDERTYPE.ID_UNDERLYING_TYPE AS 'UNDER TYPE',
    						SHORT.ID_SHORT_LONG AS 'SHORT',
    						SHORTTYPE.ID_SHORT_LONG_TYPE AS 'SHORT TYPE',
    						PUT.ID_PUT_CALL AS 'PUT CALL',
    						PUTTYPE.ID_PUT_CALL_TYPE AS 'PUT CALL TYPE'
    					FROM	
    						(((((((((((((COM_USER.FUNDS AS FOND LEFT JOIN COM_USER.FUNDS_YEAR AS ANNEE_FOND ON FOND.ID_FUNDS = ANNEE_FOND.ID_FUNDS)
    							LEFT JOIN COM_USER.INVESTMENT AS INVEST ON ANNEE_FOND.ID_YEAR = INVEST.ID_YEAR)
    							LEFT JOIN COM_USER.LISTING_STATUS AS LISTING ON INVEST.ID_INVESTMENT = LISTING.ID_INVESTMENT)
    							LEFT JOIN COM_USER.EXPOSURE AS EXPOSURE ON LISTING.ID_LISTING = EXPOSURE.ID_LISTING) 
    							LEFT JOIN COM_USER.EXPOSURE_TYPE AS EXPOTYPE ON EXPOSURE.ID_EXPOSURE_TYPE = EXPOTYPE.ID_EXPOSURE_TYPE)
    							LEFT JOIN COM_USER.DERIVATIVES AS DERIV ON EXPOSURE.ID_EXPOSURE = DERIV.ID_EXPOSURE)
    							LEFT JOIN COM_USER.DERIVATIVES_TYPE AS DERIVTYPE 
    								ON (EXPOTYPE.ID_EXPOSURE_TYPE = DERIVTYPE.ID_EXPOSURE_TYPE 
    										AND DERIV.ID_DERIVATIVES_TYPE = DERIVTYPE.ID_DERIVATIVES_TYPE))
    							LEFT JOIN COM_USER.UNDERLYING AS UNDER ON DERIV.ID_DERIVATIVES = UNDER.ID_DERIVATIVES)
    							LEFT JOIN COM_USER.UNDERLYING_TYPE AS UNDERTYPE ON UNDERTYPE.ID_UNDERLYING_TYPE = UNDER.ID_UNDERLYING_TYPE)
    							LEFT JOIN COM_USER.SHORT_LONG AS SHORT ON UNDER.ID_UNDERLYING = SHORT.ID_UNDERLYING)
    							LEFT JOIN COM_USER.SHORT_LONG_TYPE AS SHORTTYPE
    								ON (SHORT.ID_SHORT_LONG_TYPE = SHORTTYPE.ID_SHORT_LONG_TYPE 
    										AND SHORTTYPE.ID_UNDERLYING_TYPE = UNDERTYPE.ID_UNDERLYING_TYPE))
    							LEFT JOIN COM_USER.PUT_CALL_TYPE AS PUTTYPE  
    								ON SHORTTYPE.ID_SHORT_LONG_TYPE = PUTTYPE.ID_SHORT_LONG_TYPE))
    							LEFT JOIN COM_USER.PUT_CALL AS PUT
    								ON (SHORT.ID_SHORT_LONG = PUT.ID_SHORT_LONG 
    										AND PUTTYPE.ID_PUT_CALL_TYPE = PUT.ID_PUT_CALL_TYPE)
    					WHERE FOND.ID_FUNDS = @NUM_FOND 
    							AND FOND.ID_FUNDS = ANNEE_FOND.ID_FUNDS 
    							AND ANNEE_FOND.ID_YEAR = (SELECT ID_YEAR 
    														FROM COM_USER.FUNDS_YEAR 
    														WHERE ID_FUNDS = @NUM_FOND 
    															AND ANNEE = @NUM_ANNEE)
     
    			-- OUVERTURE DU 1ER RECORD
    			OPEN REC1
    			-- ON RECUPERE LES INFORMATIONS DU RECORD
    			FETCH REC1 INTO @IDFOND, @IDYEAR, @IDINVEST, @IDLIST, @IDEXPO, @IDEXPOTYPE,
    					@IDDERIV, @IDDERIVTYPE, @IDUNDER, @IDUNDERTYPE, @IDSHORT, @IDSHORTTYPE,
    					@IDPUT, @IDPUTTYPE
     
    			-- TANT QU'IL EXISTE DES ENREGISTREMENTS
    			WHILE @@FETCH_STATUS = 0
    				BEGIN
    						-----------------------------
    						-- DEBUT DE LA TRANSACTION --
    						-----------------------------
     
    						BEGIN TRANSACTION EFFACEMENT_DES_DONNEES
     
     
    							-- ON AFFICHE LES DONNEES QUI VONT ETRE SUPPRIMEES
    							SELECT @IDFOND AS 'FOND', @IDYEAR AS 'ANNEE', @IDINVEST AS 'INVEST', 
    								@IDLIST AS 'LIST', @IDEXPO AS 'EXPO', @IDEXPOTYPE AS 'EXPO TYPE',
    								@IDDERIV AS 'DERIV', @IDDERIVTYPE AS 'DERIV TYPE', 
    								@IDUNDER AS 'UNDER', @IDUNDERTYPE AS 'UNDER TYPE', 
    								@IDSHORT AS 'SHORT', @IDSHORTTYPE AS 'SHORT TYPE',
    								@IDPUT AS 'PUT CALL', @IDPUTTYPE AS 'PUT CALL TYPE'
     
    							-- SUPPRESSION DANS LA TABLE PUT_CALL (2)
    							IF @IDPUT <> NULL
    								BEGIN
    									DELETE FROM COM_USER.PUT_CALL
    									WHERE ID_SHORT_LONG = @IDPUT
    										AND ID_PUT_CALL_TYPE = @IDPUTTYPE
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- SUPPRESSION DANS LA TABLE PUT_CALL_TYPE
    							IF @IDPUTTYPE <> NULL
    								BEGIN
    									DELETE FROM COM_USER.PUT_CALL_TYPE 
    									WHERE ID_PUT_CALL_TYPE = @IDPUTTYPE
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- SUPPRESSION DANS LA TABLE SHORT_LONG_TYPE (2)
    							IF @IDSHORTTYPE <> NULL
    								BEGIN
    									DELETE FROM COM_USER.SHORT_LONG_TYPE
    									WHERE ID_SHORT_LONG_TYPE = @IDSHORTTYPE
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- SUPPRESSION DANS LA TABLE SHORT_LONG
    							IF @IDSHORT <> NULL
    								BEGIN
    									DELETE FROM COM_USER.SHORT_LONG
    									WHERE ID_SHORT_LONG = @IDSHORT
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- SUPPRESSION DANS LA TABLE UNDERLYING_TYPE
    							IF @IDUNDERTYPE <> NULL
    								BEGIN
    									DELETE FROM COM_USER.UNDERLYING_TYPE
    									WHERE ID_UNDERLYING_TYPE = @IDUNDERTYPE
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- SUPPRESSION DANS LA TABLE UNDERLYING
    							IF @IDUNDER <> NULL
    								BEGIN
    									DELETE FROM COM_USER.UNDERLYING
    									WHERE ID_UNDERLYING = @IDUNDER
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- SUPPRESSION DANS LA TABLE DERIVATIVES_TYPE (2)
    							IF @IDDERIVTYPE <> NULL
    								BEGIN
    									DELETE FROM COM_USER.DERIVATIVES_TYPE
    									WHERE ID_EXPOSURE_TYPE = @IDEXPOTYPE 
    										AND ID_DERIVATIVES_TYPE = @IDDERIVTYPE
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE								
    								END
     
    							-- SUPPRESSION DANS LA TABLE DERIVATIVES
    							IF @IDDERIV <> NULL
    								BEGIN
    									DELETE FROM COM_USER.DERIVATIVES
    									WHERE ID_DERIVATIVES = @IDDERIV
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE						
    								END
     
    							-- SUPPRESSION DANS LA TABLE EXPOSURE_TYPE
    							IF @IDEXPOTYPE <> NULL
    								BEGIN
    									DELETE FROM COM_USER.EXPOSURE_TYPE
    									WHERE ID_EXPOSURE_TYPE = @IDEXPOTYPE
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- SUPPRESSION DANS LA TABLE EXPOSURE
    							IF @IDLIST <> NULL
    								BEGIN
    									DELETE FROM COM_USER.EXPOSURE
    									WHERE ID_LISTING = @IDLIST
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- SUPPRESSION DANS LA TABLE LISTING_STATUS
    							IF @IDLIST <> NULL
    								BEGIN
    									DELETE FROM COM_USER.LISTING_STATUS
    									WHERE ID_INVESTMENT = @IDINVEST
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- SUPPRESSION DANS LA TABLE INVESTMENT (2)
    							IF @IDINVEST <> NULL
    								BEGIN
    									DELETE FROM COM_USER.INVESTMENT
    									WHERE ID_YEAR = @IDYEAR
    										AND ID_INVESTMENT = @IDINVEST
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- SUPPRESSION DANS LA TABLE FUNDS_YEAR (2)
    							IF @IDYEAR <> NULL
    								BEGIN
    									DELETE FROM COM_USER.FUNDS_YEAR
    									WHERE ID_FUNDS = @IDFOND
    										AND ID_YEAR = @IDYEAR
    									SET @ERREURS = @ERREURS + @@ERROR -- ON RECUPERE L'ERREUR EVENTUELLE
    								END
     
    							-- ON PASSE AU RECORD SUIVANT
    							FETCH REC1 INTO @IDFOND, @IDYEAR, @IDINVEST, @IDLIST, @IDEXPO, @IDEXPOTYPE,
    								@IDDERIV, @IDDERIVTYPE, @IDUNDER, @IDUNDERTYPE, @IDSHORT, @IDSHORTTYPE,
    								@IDPUT, @IDPUTTYPE
     
     
    						----------------------------------
    						-- VALIDATION DE LA TRANSACTION --
    						----------------------------------
    						PRINT 'Statut de l''erreur : ' + CAST(@ERREURS AS VARCHAR(10)) --On affiche le statut de l'erreur
     
    						IF @ERREURS = 0 -- SI ERREUR EST EGAL A ZERO IL N'Y A PAS EU D'ERRREURS
    							COMMIT TRANSACTION EFFACEMENT_DES_DONNEES -- ON VALIDE LA TRANSACTION
    						ELSE -- S'IL Y A EU DES ERREURS
    							ROLLBACK TRANSACTION EFFACEMENT_DES_DONNEES -- ON ANNULE TOUS LES CHANGEMENTS
     
     
    				END -- FIN DE LA BOUCLE WHILE
     
    			CLOSE REC1 -- FERMETURE DU RECORD
    			DEALLOCATE REC1 -- DESTRUCTION DE L'OBJET
     
    		END -- FIN DE LA CONDITION
    	ELSE -- SI ON L'UN DES DEUX OU LES DEUX VARIABLES NE SONT PAS MENTIONNEES
    		RETURN -1 -- ON RETOURNE UNE VALEUR FICTIVE
    END
    Lors de l'enregistrement, tout se passe bien.
    Si j'exécute la requête, voici ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Statut de l'erreur : 0
    Statut de l'erreur : 0
    Statut de l'erreur : 0
    Statut de l'erreur : 0
    Statut de l'erreur : 0
     
    (1 row(s) affected)
    Malgré cela, je n'ai aucun effacement.
    Pourriez-vous me dire pourquoi ???

  9. #9
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Bonjour,

    Premièrement, évitons le curseur (je n'ai pas lu toute la proc, je manque de vitamines).
    Tu veux supprimer quelle table ?
    Tu peux utiliser une syntaxe étendue T-SQL :
    SELECT
    FROM
    FROM

    Mais tu ne peux supprimer des lignes que d'une seule table à la fois.

  10. #10
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    Bonjour,

    Je ne suis pas un pro de SQL alors si on regarde ma procédure, voici ce qu'elle fait :

    D'abord un select de tous les ID qui se rattachent à une ANNEE spécifique pour un FOND spécifique dans toutes les tables (14 au total).
    Ensuite j'ouvre le curseur sur cette requete de SELECT et pour chaque RECORD, je vais dans chacune des tables EFFACER le record contenant l'ID concerné.

    Donc, dans mon WHILE, j'ai créé une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WHILE @@FETCH_STATUS = 0
        BEGIN
            BEGIN TRANSACTION a
                 ... toutes les requetes d''effacement
            COMMIT TRANSACTION a
        END
    Seulement voilà, rien ne se passe ;-(

  11. #11
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    Aurais-tu un tuto ou un exemple pour la syntaxe :

    SELECT
    FROM
    FROM

    ??????

  12. #12
    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 : 43
    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,

    La remarque de tazmania n'est pas à ignorer : en T-SQL, on peut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DELETE FROM dbo.maTable
    FROM dbo.maTable A
    JOIN dbo.maTable2 B on A.ID = B.ID
    WHERE B.maColonne = maValeur
    Et mettre autant de jointures que nécessaire.
    L'utilisation de curseurs ou de boucles while est à proscrire autant que c'est possible, parce que c'est lent parce que ce n'est pas ensembliste

    Si tu veux que ta procédure soit très rapide, en supposant que tu disposes des bons indexes, alors tu peux reprendre l'exemple que je t'ai donné : les conditions de tes IF dans le parcours de ton curseur deviennent les restrictions WHERE de l'exemple

    Fais-nous signe si tu pêches

  13. #13
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    Je croule lol
    J'ai l'impression que ce sont les relations qui me posent problème mais je n'en suis pas sûre.
    En effet, si je fais un simple delete sur une table il me sort un message du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Msg 547, Level 16, State 0, Line 1
    DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_INVESTME_ASSC_25_FUNDS_YE'. 
    The conflict occurred in database 'DEV_COMMISION', table 'INVESTMENT', column 'ID_YEAR'.
    The statement has been terminated.
     
    (0 row(s) affected)
    J'ai lu qu'il suffisait de faire un DELETE dans la table du plus haut niveau et que les enfant seraient supprimés mais ce n'est pas le cas.

    J'ai tenté les expressions du genre :
    Ou encore du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE
    FROM CURRENT OF mon_curseur
    Mais rien ne se passe de positif.

    Je continue de chercher ...

  14. #14
    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 : 43
    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
    Rebonjour

    J'ai lu qu'il suffisait de faire un DELETE dans la table du plus haut niveau et que les enfant seraient supprimés mais ce n'est pas le cas.
    Ceci est vrai si ON DELETE CASCADE a été spécifié lors de la création de la table. Dans le cas contraire, on obtient ton erreur

    Mais rien ne se passe de positif.
    Montre nous ton code, ça nous aidera à t'aider

  15. #15
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2003
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 274
    Par défaut
    J'ai trouvé la solution hier soir :

    En fait, lors de la création des tables, les suppressions étaient interdites.
    Je me suis penché sur la sécurité des tables et j'ai donc troucé ma solution :

    1) J'ai vérifié chaque table et noté toutes les contraintes
    2) Dans le code, avant de commencer toute opération, j'élimine toutes les contraintes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE ma_table DROP CONSTRAINT la_contrainte
    3) J'effectue toutes mes opérations de suppressions.
    4) Je remets les contraintes de toutes les tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ALTER TABLE ma_table
       ADD CONSTRAINT la_contrainte 
    	FOREIGN KEY (id_concerné)
    		REFERENCES la_table_contenant_l_id (id_concerne)
    			ALTER TABLE ma_table CHECK CONSTRAINT la_contrainte
    Voilà, tout fonctionne maintenant ....

    Merci à tout le monde pour votre aide.

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

Discussions similaires

  1. [Access] Prob ds un Delete avec jointure
    Par fikou dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 25/06/2009, 00h04
  2. [SQL Server CE] DELETE avec jointure
    Par Nico57 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/02/2008, 17h03
  3. Requête DELETE avec jointure
    Par Roach- dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/03/2006, 15h00
  4. Delete avec jointure impossible
    Par _developpeur_ dans le forum Access
    Réponses: 13
    Dernier message: 18/11/2005, 16h22
  5. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19

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