J'ai 2 tables avec les mêmes colonnes. La première table Temp1 est chargée avec un sp et est temporaire. Il permet de charger une table T1 sur un environnement de production. Par exemple, j'ai ces données:
Table Temp1
Id Col1 Col2 Col3 Col4 Col5
2 null null 0.5 null 0.6
3 0.1 null null null null
Table T1
Id Col1 Col2 Col3 Col4 Col5
1 2 3 0.4 5 0.6
2 5 4 6 4 7
3 8 9 7 10 1
Je dois mettre à jour T1 avec les données de Temp1 uniquement lorsque les colonnes de Temp1 ne sont pas nulles et n'ont pas la même valeur dans T1 (valeurs en gras dans mon exemple).
Je suis coincé avec ce problème. Des idées s'il vous plaît?
Merci,
3 réponses
Utiliser une instruction de mise à jour avec une expression de cas serait quelque chose comme ça.
update tt1
set Col1 = case when T.Col1 is not null and T.Col1 <> tt1.Col1 then T.Col1 else tt1.Col1 end
from T1 tt1
join Temp1 t on t.Id = tt1.Id
UPDATE T1
SET T1.Col1 = ISNULL(NULLIF(ISNULL(tmp.Col1 , T1.Col1) , T1.Col1) , T1.Col1)
, T1.Col2 = ISNULL(NULLIF(ISNULL(tmp.Col2 , T1.Col2) , T1.Col2) , T1.Col2)
, T1.Col3 = ISNULL(NULLIF(ISNULL(tmp.Col3 , T1.Col3) , T1.Col3) , T1.Col3)
, T1.Col4 = ISNULL(NULLIF(ISNULL(tmp.Col4 , T1.Col4) , T1.Col4) , T1.Col4)
, T1.Col5 = ISNULL(NULLIF(ISNULL(tmp.Col5 , T1.Col5) , T1.Col5) , T1.Col5)
FROM Temp1 tmp
INNER JOIN T1 ON t1.ID = tmp.ID
Vous pouvez utiliser une instruction merge pour ce problème.
CREATE TABLE #t
(
ID int IDENTITY(1,1),
Name NVARCHAR(50),
Salary DECIMAL(10,2)
)
INSERT INTO #t (Name, Salary) VALUES('abc', 123.4)
INSERT INTO #t (Name, Salary) VALUES('pqa', 127.4)
INSERT INTO #t (Name, Salary) VALUES('xyz', 233.4)
CREATE TABLE #tempForT
(
ID int IDENTITY(1,1),
Name NVARCHAR(50),
Salary DECIMAL(10,2)
)
INSERT INTO #tempForT (Name, Salary) VALUES('abc', 200.4)
INSERT INTO #tempForT (Name, Salary) VALUES('pqa', 200.4)
INSERT INTO #tempForT (Name, Salary) VALUES('xyz', NULL)
SELECT * FROM #t
SELECT * FROM #tempForT
Voici la solution
MERGE #t AS DestTable
USING (
SELECT
NAME,
Salary
FROM #tempForT
)SourceTable
ON DestTable.Name = SourceTable.Name --Should contain columns like composite primary key
--AND other columns
WHEN MATCHED
THEN
UPDATE
SET DestTable.Salary = ISNULL(SourceTable.Salary, DestTable.Salary) --checking for NULL
;
SELECT * FROM #t
Remarque : Si #tempForT contient de nouvelles valeurs (lignes), ces lignes ne seront pas insérées pour cela, vous devez mettre à jour l'instruction de fusion avec WHEN NOT MATCHED dans ce cas insérer nouveaux records.
De nouvelles questions
sql
Le langage de requête structuré (SQL) est un langage permettant d'interroger des bases de données. Les questions doivent inclure des exemples de code, une structure de table, des exemples de données et une balise pour l'implémentation du SGBD (par exemple MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, etc.) utilisés. Si votre question concerne uniquement un SGBD spécifique (utilise des extensions / fonctionnalités spécifiques), utilisez plutôt la balise de ce SGBD. Les réponses aux questions marquées avec SQL doivent utiliser le standard SQL ISO / IEC.