[SQLSERVER2005] Update "for each"
Bonjour,
Je souhaite faire un update sur un champs d'une table, qui doit reprendre une donnée provenant d'une table de liaison comprenant l'id de la première table
Pourquoi faire ceci, car la table de liaison est devenue inutile, le but est donc de rapatrier les données dans la première table avant de l'effacer
Table Employes
employe_id
nom
prenom
service_id
Table Service_Employe
service_id
employe_id
Au départ je cherchais à faire quelque chose comme :
Code:
1 2 3 4 5 6 7
| update dbo.EMPLOYES
set SERVICE_ID =
(
select es.SERVICE_ID
from dbo.EMPLOYE_SERVICE es, dbo.EMPLOYES e
where e.EMPLOYE_ID = es.EMPLOYE_ID
) |
Ca ne fonctionne pas car la sous requête renvoit plusieurs lignes (autant que le nombre de ligne de la table Employes)
Pour résoudre cela, j'ai regardé du côté des curseurs, mais j'avoue coincer, d'une part pour la syntaxe, et d'autre part car je ne suis pas sur d'avoir compris la "logique" curseur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| DECLARE @id int
DECLARE Employee_Cursor CURSOR FOR
SELECT EMPLOYE_ID, SERVICE_ID
FROM dbo.EMPLOYES
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
set @id = select employe_id from dbo.EMPLOYES WHERE CURRENT OF Employee_Cursor
update dbo.EMPLOYES
set SERVICE_ID =
(
select es.SERVICE_ID
from dbo.EMPLOYE_SERVICE es where dbo.employes.employe_id = @id
)
WHERE CURRENT OF Employee_Cursor
FETCH NEXT FROM Employee_Cursor;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor; |
L'idée repose dans le
Code:
set @id = select employe_id from dbo.EMPLOYES WHERE CURRENT OF Employee_Cursor
qui ne fonctionne pas, mais il est là pour exprimer ce que je souhaite faire
Pour résumer, pour chaque ligne de la table Employe, je souhaite renseigner la colonne "service_id" avec la valeur correspondante dans la table de liaison
1 employé ne peut se trouver que dans 1 seul service
Merci d'avance pour les aides, suggestions et autres !