sql - multiple - update table from another table oracle




Mise à jour SQL d'une table à une autre en fonction d'une correspondance d'ID (14)

Cela vous permettra de mettre à jour une table en fonction de la valeur de la colonne qui ne se trouve pas dans une autre table.

    UPDATE table1 SET table1.column = 'some_new_val' WHERE table1.id IN (
            SELECT * 
            FROM (
                    SELECT table1.id
                    FROM  table1 
                    LEFT JOIN table2 ON ( table2.column = table1.column ) 
                    WHERE table1.column = 'some_expected_val'
                    AND table12.column IS NULL
            ) AS Xalias
    )

Cela mettra à jour une table en fonction de la valeur de colonne trouvée dans les deux tables.

    UPDATE table1 SET table1.column = 'some_new_val' WHERE table1.id IN (
            SELECT * 
            FROM (
                    SELECT table1.id
                    FROM  table1 
                    JOIN table2 ON ( table2.column = table1.column ) 
                    WHERE table1.column = 'some_expected_val'
            ) AS Xalias
    )

J'ai une base de données avec les account numbers et card numbers . Je fais correspondre ceux-ci à un fichier pour update à update les numéros de carte au numéro de compte, de sorte que je ne travaille qu'avec les numéros de compte.

J'ai créé une vue reliant la table à la base de données de compte / carte pour retourner l' Table ID et le numéro de compte associé, et maintenant j'ai besoin de mettre à jour ces enregistrements où l'ID correspond au numéro de compte.

Ceci est la table Sales_Import , où le champ de account number doit être mis à jour:

LeadID  AccountNumber
147         5807811235
150         5807811326
185         7006100100007267039

Et RetrieveAccountNumber table RetrieveAccountNumber , où j'ai besoin de mettre à jour à partir de:

LeadID  AccountNumber
147         7006100100007266957
150         7006100100007267039

J'ai essayé le ci-dessous, mais pas de chance jusqu'à présent:

UPDATE [Sales_Lead].[dbo].[Sales_Import] 
SET    [AccountNumber] = (SELECT RetrieveAccountNumber.AccountNumber 
                          FROM   RetrieveAccountNumber 
                          WHERE  [Sales_Lead].[dbo].[Sales_Import]. LeadID = 
                                                RetrieveAccountNumber.LeadID) 

Il met à jour les numéros de carte aux numéros de compte, mais les numéros de compte sont remplacés par NULL


J'ai eu le même problème avec foo.new étant mis à null pour les lignes de foo qui n'avaient pas de clé correspondante dans la bar . J'ai fait quelque chose comme ça dans Oracle:

update foo
set    foo.new = (select bar.new
                  from bar 
                  where foo.key = bar.key)
where exists (select 1
              from bar
              where foo.key = bar.key)

Je pensais que c'est un exemple simple si quelqu'un pouvait le faire plus facilement,

        DECLARE @TB1 TABLE
        (
            No Int
            ,Name NVarchar(50)
        )

        DECLARE @TB2 TABLE
        (
            No Int
            ,Name NVarchar(50)
        )

        INSERT INTO @TB1 VALUES(1,'asdf');
        INSERT INTO @TB1 VALUES(2,'awerq');


        INSERT INTO @TB2 VALUES(1,';oiup');
        INSERT INTO @TB2 VALUES(2,'lkjhj');

        SELECT * FROM @TB1

        UPDATE @TB1 SET Name =S.Name
        FROM @TB1 T
        INNER JOIN @TB2 S
                ON S.No = T.No

        SELECT * FROM @TB1

Je veux ajouter cette mise à jour pour le code Access SQL ou VBA: nous devons faire le JOIN avant le SET.

Accéder à SQL

UPDATE
    Sales_Import
INNER JOIN
    RetrieveAccountNumber 
ON 
    Sales_Import.LeadID = RetrieveAccountNumber.LeadID
SET
    Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;

La façon simple de copier le contenu d'une table à l'autre est la suivante:

UPDATE table2 
SET table2.col1 = table1.col1, 
table2.col2 = table1.col2,
...
FROM table1, table2 
WHERE table1.memberid = table2.memberid

Vous pouvez également ajouter la condition pour obtenir les données particulières copiées.


Le SQL ci-dessous suggéré par quelqu'un, ne fonctionne pas dans SQL Server. Cette syntaxe me rappelle mon ancienne classe:

UPDATE table2 
SET table2.col1 = table1.col1, 
table2.col2 = table1.col2,
...
FROM table1, table2 
WHERE table1.memberid = table2.memberid

Toutes les autres requêtes utilisant NOT IN ou NOT EXISTS ne sont pas recommandées. Les valeurs NULL s'affichent car OP compare l'ensemble de données complet avec un sous-ensemble plus petit, puis, bien sûr, il y aura un problème de correspondance. Cela doit être corrigé en écrivant le bon SQL avec le bon JOIN au lieu d'éviter le problème en utilisant NOT IN . Vous pourriez rencontrer d'autres problèmes en utilisant NOT IN ou NOT EXISTS dans ce cas.

Mon vote pour le premier, qui est une façon conventionnelle de mettre à jour une table basée sur une autre table en se joignant à SQL Server. Comme je l'ai dit, vous ne pouvez pas utiliser deux tables dans la même instruction UPDATE dans SQL Server à moins de les joindre d'abord.


On dirait que vous utilisez MSSQL, alors, si je me souviens bien, c'est comme ça:

UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = 
RetrieveAccountNumber.AccountNumber 
FROM RetrieveAccountNumber 
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID

Pour MySql :

UPDATE table1 JOIN table2 
ON table1.id = table2.id
SET table1.name = table2.name,
table1.`desc` = table2.`desc`

Pour Sql Server :

UPDATE table1
SET table1.name = table2.name,
table1.[desc] = table2.[desc]
FROM table1 JOIN table2 
ON table1.id = table2.id

J'ai utilisé toutes les requêtes ci-dessus, mais elles ne fonctionnent pas; et quand j'ai utilisé celui-ci, c'est fait.

Vous pouvez l'attraper d'ici aussi, https://.com/questions/5036918/update-one-table-with-data-from-another

J'espère que vous l'aurez compris. Merci


Pour PostgreSQL:

UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID; 

Pour SQL Server 2008 + L'utilisation de MERGE plutôt que de la syntaxe propriétaire UPDATE ... FROM est intéressante.

En plus d'être un SQL standard et donc plus portable, il provoquera une erreur en cas de plusieurs lignes jointes côté source (et donc plusieurs valeurs différentes possibles à utiliser dans la mise à jour) plutôt que d'avoir un résultat final indéterminé .

MERGE INTO Sales_Import
   USING RetrieveAccountNumber
      ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
WHEN MATCHED THEN
   UPDATE 
      SET AccountNumber = RetrieveAccountNumber.AccountNumber;

Malheureusement, le choix de l'utilisation ne peut pas descendre purement à un style préféré cependant. L'implémentation de MERGE dans SQL Server a été affectée par divers bogues. Aaron Bertrand a compilé une liste des rapports ici .


Si les réponses ci-dessus ne vous conviennent pas, essayez ceci

Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
Set A.AccountNumber = B.AccountNumber
where A.LeadID = B.LeadID 

Utilisez le bloc de requête suivant pour mettre à jour Table1 avec Table2 en fonction de l'ID:

UPDATE Sales_Import, RetrieveAccountNumber 
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber 
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;

C'est la manière la plus simple de résoudre ce problème.


mettre à jour dans le même tableau:

  DECLARE @TB1 TABLE
    (
        No Int
        ,Name NVarchar(50)
        ,linkNo int
    )

    DECLARE @TB2 TABLE
    (
        No Int
        ,Name NVarchar(50)
        ,linkNo int
    )

    INSERT INTO @TB1 VALUES(1,'changed person data',  0);
    INSERT INTO @TB1 VALUES(2,'old linked data of person', 1);

INSERT INTO @TB2 SELECT * FROM @TB1 WHERE linkNo = 0


SELECT * FROM @TB1
SELECT * FROM @TB2


    UPDATE @TB1 
        SET Name = T2.Name
    FROM        @TB1 T1
    INNER JOIN  @TB2 T2 ON T2.No = T1.linkNo

    SELECT * FROM @TB1

essaye ça :

UPDATE
    Table_A
SET
    Table_A.AccountNumber = Table_B.AccountNumber ,
FROM
    dbo.Sales_Import AS Table_A
    INNER JOIN dbo.RetrieveAccountNumber AS Table_B
        ON Table_A.LeadID = Table_B.LeadID 
WHERE
    Table_A.LeadID = Table_B.LeadID




sql-update