Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment faire la mise à jour de la table Sql Server CE à partir d'une autre table

Votre deuxième tentative ne fonctionne pas car, d'après l'entrée Books On-Line pour MISE À JOUR , SQL CE n'autorise pas un FROM clause dans une instruction de mise à jour.

Je n'ai pas SQL Compact Edition pour le tester, mais cela pourrait fonctionner :

UPDATE JOBMAKE
SET WIP_STATUS = '10sched1'
WHERE EXISTS (SELECT 1
              FROM JOBVISIT AS JV
              WHERE JV.JBT_TYPE   = JOBMAKE.JBT_TYPE
              AND   JV.JOB_NUMBER = JOBMAKE.JOB_NUMBER
              AND   JV.JVST_ID    = @jvst_id
             )

Il se peut que vous puissiez utiliser l'alias JOBMAKE en tant que JM pour raccourcir légèrement la requête.

MODIFIER

Je ne suis pas sûr à 100% des limitations de SQL CE en ce qui concerne la question soulevée dans les commentaires (comment mettre à jour une valeur dans JOBMAKE en utilisant une valeur de JOBVISIT). Tenter de faire référence au contenu de la clause EXISTS dans la requête externe n'est pris en charge dans aucun dialecte SQL que j'ai rencontré, mais il existe une autre méthode que vous pouvez essayer. Ceci n'a pas été testé mais peut fonctionner, car il semble que SQL CE supporte les sous-requêtes corrélées :

UPDATE JOBMAKE 
SET WIP_STATUS = (SELECT JV.RES_CODE 
                  FROM JOBVISIT AS JV 
                  WHERE JV.JBT_TYPE = JOBMAKE.JBT_TYPE 
                  AND   JV.JOB_NUMBER = JOBMAKE.JOB_NUMBER 
                  AND   JV.JVST_ID = 20
                 )

Il y a cependant une limite. Cette requête échouera si plus d'une ligne dans JOBVISIT est réajustée pour chaque ligne dans JOBMAKE. Si cela ne fonctionne pas (ou si vous ne pouvez pas limiter directement la requête interne à une seule ligne par ligne externe), il serait possible d'effectuer une mise à jour ligne par ligne à l'aide d'un curseur.