web-dev-qa-db-fra.com

Mettre à jour la table à l'aide des valeurs d'une autre table dans SQL Server

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?

11
John Doe

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;
24
Martin Smith
UPDATE TS
SET TS.TaskFullAddress = L.FullAddress
FROM [dbo].[TaskOrders]   TS
INNER JOIN Locations L
ON  TS.ClientId  = L.ClientId;
0
David Fawzy