web-dev-qa-db-fra.com

Instruction de mise à jour pour mettre à jour plusieurs lignes

J'ai une question concernant la syntaxe suivante. Existe-t-il un moyen plus propre de regrouper cela en une seule déclaration plutôt qu'en deux? J'ai essayé plusieurs itérations mais cela semble être la seule façon de réussir à exécuter ces deux instructions.

UPDATE employee
SET hire_date = '1979-03-15'
WHERE emp_id = 'PMA42628M' 

UPDATE employee
SET hire_date = '1988-12-22'
where emp_id = 'PSA89086M'; 

J'ai également essayé cela et j'ai également essayé d'utiliser une instruction AND. Aucun n'a fonctionné. Fondamentalement, je recherche un moyen moins novice que la méthode ci-dessus, si elle existe. J'ai passé beaucoup de temps à chercher et je n'en ai pas trouvé.

UPDATE employee
SET hire_date = ('1979-03-15', '1988-12-22')
WHERE emp_id = ('PMA42628M', 'PSA89086M');

Appriciez n'importe quel conseil sur celui-ci, et en passant, j'utilise le serveur sql. Merci

18
user2454335

Essayez celui-ci, cela combinera plusieurs sélections et les renvoie comme si elles provenaient de la base de données:

UPDATE e
SET hire_date = t.hire_date
FROM dbo.employee e
JOIN (
    SELECT emp_id = 'PMA42628M', hire_date = '1979-03-15'
    UNION ALL
    SELECT emp_id = 'PSA89086M', hire_date = '1988-12-22'
) t ON t.emp_id = e.emp_id

Si vous utilisez SQL Server 2008 ou une version ultérieure, vous pouvez également utiliser une syntaxe différente pour la table dérivée:

UPDATE e
SET hire_date = t.hire_date
FROM dbo.employee e
JOIN (
    VALUES
        ('PMA42628M', '1979-03-15'),
        ('PSA89086M', '1988-12-22')
) t (emp_id, hire_date) ON t.emp_id = e.emp_id
26
Devart

Je cherche un moyen moins novice

Faire deux déclarations de mise à jour distinctes est (selon moi) "la façon la moins novice" de compliquer les choses et de faire quelque chose comme ça.

update employee
set hire_date = case emp_id
                  when 'PMA42628M' then '1979-03-15'
                  when 'PSA89086M' then '1988-12-22'
                end
where emp_id in ('PMA42628M', 'PSA89086M')

mais qu'est-ce que cela vous apporterait? La mise à jour entière s'exécuterait dans une transaction implicite, donc si vous voulez que vos deux mises à jour soient dans une transaction, vous utilisez simplement begin transaction .... commit.

9
Mikael Eriksson

Vous pouvez créer une table temporaire ou une variable de table contenant les mises à jour que vous souhaitez effectuer, puis exécuter l'instruction UPDATE liant la table à la table que vous souhaitez mettre à jour.

Notez que pour deux mises à jour, vous obtenez deux instructions: INSERT dans la table de mise à jour et l'instruction UPDATE elle-même. Le nombre de déclarations reste cependant deux pour autant de mises à jour que vous devez faire.

CREATE TABLE #employee (emp_id VARCHAR(9) NOT NULL PRIMARY KEY,hire_date DATE NOT NULL);
INSERT INTO #employee (emp_id,hire_date)
VALUES ('PMA42628M','2013-06-05'),('PSA89086M','2013-06-05');

CREATE TABLE #target_updates(emp_id VARCHAR(9) NOT NULL,hire_date DATE NOT NULL);
INSERT INTO #target_updates (emp_id,hire_date)
VALUES ('PMA42628M','1979-03-15'),('PSA89086M','1988-12-22');
UPDATE
    #employee
SET
    hire_date=tu.hire_date
FROM
    #employee AS e
    INNER JOIN #target_updates AS tu ON
        tu.emp_id=e.emp_id;

SELECT
    *
FROM
    #employee
ORDER BY
    emp_id;
DROP TABLE #target_updates;
DROP TABLE #employee;
6
TT.