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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 !