J'ai 2 tables dans ma base de données.
Tableau 1
-------------------------------------------------------------------------
| name | family | phone | email | gender | phone2 | address | birthdate |
-------------------------------------------------------------------------
Tableau 2
-----------------------------------------
| gender | address | phone | birthdate |
-----------------------------------------
dans les colonnes du tableau # 1 adresse et phone2 est vide et les valeurs des colonnes gender et date de naissance sont les mêmes que celles du tableau # 2 .
Comment puis-je lire les données du tableau # 2 et mettre à jour adresse et phone2 dans le tableau # 1 avec les valeurs du tableau # 2 adresse et téléphone colonnes lorsque sexe et date de naissance est le même dans chaque ligne?
par exemple: voici quelques données du tableau n ° 1
-------------------------------------------------------------------------
| name | family | phone | email | gender | phone2 | address | birthdate |
-------------------------------------------------------------------------
| john | doe | 12345| [email protected]| Male | | | 1980-01-01|
-------------------------------------------------------------------------
| mike | clark | 65432| [email protected]| Male | | | 1990-01-01|
-------------------------------------------------------------------------
| Sara | King | 875465| [email protected]|Female| | | 1970-01-01|
-------------------------------------------------------------------------
et voici quelques données dans le tableau # 2
-----------------------------------------
| gender | address | phone | birthdate |
-----------------------------------------
| Male | 1704test|0457852|1980-01-01 |
-----------------------------------------
| Female | 1705abcs|0986532|1970-01-01 |
-----------------------------------------
| Male | 1602cyzd|0326589|1990-01-01 |
-----------------------------------------
Je veux mettre à jour le tableau # 1 avec les données du tableau # 2 et vérifier sexe et date de naissance et faire le tableau # 1 comme
-------------------------------------------------------------------------
| name | family | phone | email | gender | phone2 | address | birthdate |
-------------------------------------------------------------------------
| john | doe | 12345| [email protected]| Male |0457852 |1704test | 1980-01-01|
-------------------------------------------------------------------------
| mike | clark | 65432| [email protected]| Male |0326589 |1602cyzd| 1990-01-01|
-------------------------------------------------------------------------
| Sara | King | 875465| [email protected]|Female |0986532 |1705abcs| 1970-01-01|
-------------------------------------------------------------------------
Comment puis-je faire ceci?
Il existe plusieurs façons d'obtenir les résultats souhaités.
Méthodes non déterministes
(dans le cas où de nombreuses lignes du tableau 2 correspondent à une dans le tableau 1)
UPDATE T1
SET address = T2.address,
phone2 = T2.phone
FROM #Table1 T1
JOIN #Table2 T2
ON T1.gender = T2.gender
AND T1.birthdate = T2.birthdate
Ou une forme un peu plus concise
UPDATE #Table1
SET address = #Table2.address,
phone2 = #Table2.phone
FROM #Table2
WHERE #Table2.gender = #Table1.gender
AND #Table2.birthdate = #Table1.birthdate
Ou avec un CTE
WITH CTE
AS (SELECT T1.address AS tgt_address,
T1.phone2 AS tgt_phone,
T2.address AS source_address,
T2.phone AS source_phone
FROM #Table1 T1
INNER JOIN #Table2 T2
ON T1.gender = T2.gender
AND T1.birthdate = T2.birthdate)
UPDATE CTE
SET tgt_address = source_address,
tgt_phone = source_phone
Méthodes déterministes
MERGE
lancerait une erreur plutôt que d'accepter des résultats non déterministes
MERGE #Table1 T1
USING #Table2 T2
ON T1.gender = T2.gender
AND T1.birthdate = T2.birthdate
WHEN MATCHED THEN
UPDATE SET address = T2.address,
phone2 = T2.phone;
Ou vous pouvez choisir un enregistrement spécifique s'il y a plus d'une correspondance
Avec APPLY
UPDATE T1
SET address = T2.address,
phone2 = T2.phone
FROM #Table1 T1
CROSS APPLY (SELECT TOP 1 *
FROM #Table2 T2
WHERE T1.gender = T2.gender
AND T1.birthdate = T2.birthdate
ORDER BY T2.PrimaryKey) T2
.. Ou un CTE
WITH T2
AS (SELECT *,
ROW_NUMBER() OVER (PARTITION BY gender, birthdate ORDER BY primarykey) AS RN
FROM #Table2)
UPDATE T1
SET address = T2.address,
phone2 = T2.phone
FROM #Table1 T1
JOIN T2
ON T1.gender = T2.gender
AND T1.birthdate = T2.birthdate
AND T2.RN = 1;
UPDATE TS
SET TS.TaskFullAddress = L.FullAddress
FROM [dbo].[TaskOrders] TS
INNER JOIN Locations L
ON TS.ClientId = L.ClientId;