Vous avez dit : update déterministe ?
Bonsoir pompom75,
Histoire d’y voir plus clair, j’utilise une CTE (Common Table Expression) pour la partie SELECT. Pour la partie UPDATE, il s’agit d’une technique propre à MS SQL Server, mais attention ! Cette technique n’est pas conforme à la norme SQL et en plus elle n’est pas déterministe (horresco referens !) J’espère que vos tables sont dotées de clés, sinon ça craint...
Je cherche simplement ici à vous dépanner provisoirement, mais je ne doute pas que nos champions du SQL, les Waldar, SQLpro, Mikedavem, iberserk, elsuket, pour ne citer qu’eux, sauront traiter votre problème de façon élégante et conforme à la norme, et au besoin corriger la requête que je propose.
Un exemple
Les tables que j’utilise :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE TABLE MARQUE
(
IdMarque INT NOT NULL
, NbInterv INT NOT NULL DEFAULT 0
, CONSTRAINT MARQUE_PK PRIMARY KEY (IdMarque)
) ;
CREATE TABLE VEHICULE
(
IdVehicule INT NOT NULL
, IdMarque INT NOT NULL
, CONSTRAINT VEHICULE_PK PRIMARY KEY (IdVehicule)
, CONSTRAINT VEHICULE_FK FOREIGN KEY (IdMarque) REFERENCES MARQUE
) ;
CREATE TABLE INTERVENTION
(
IdInterv INT NOT NULL
, IdVehicule INT NOT NULL
, CONSTRAINT INTERVENTION_PK PRIMARY KEY (IdInterv)
, CONSTRAINT INTERVENTION_FK FOREIGN KEY (IdVehicule) REFERENCES VEHICULE
) ; |
La requête de mise à jour :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| ;
WITH Comptage (IdMarque, kount)
AS
(
SELECT z.IdMarque, COUNT(*) AS kount
FROM INTERVENTION AS x JOIN VEHICULE AS y ON x.IdVehicule = y.IdVehicule
JOIN MARQUE AS z ON y.IdMarque = z.IdMarque
GROUP BY z.IdMarque
)
UPDATE MARQUE
SET NbInterv = kount
FROM MARQUE AS x JOIN Comptage AS y ON x.IdMarque = y.IdMarque ; |
Et Bonne année à tous !