SQL-update van één tabel naar een andere op basis van een ID-wedstrijd

Ik heb een database met account numbersen card numbers. Ik combineer deze op een bestand in UPDATEelke kaartnummers naar het accountnummer, zodat ik alleen met accountnummers werk.

Ik heb een weergave gemaakt met de tabel aan de account / kaartdatabase om de Table IDen het gerelateerde accountnummer weer te geven, en nu moet ik die records bijwerken wanneer de ID overeenkomt met het accountnummer .

Dit is de Sales_ImportTabel, waar het account numberField moet worden bijgewerkt:

LeadID  AccountNumber
147         5807811235
150         5807811326
185         7006100100007267039

En dit is de RetrieveAccountNumberTabel, waar ik moet updaten van:

LeadID  AccountNumber
147         7006100100007266957
150         7006100100007267039

Ik heb het onderstaande geprobeerd, maar geen geluk tot nu toe:

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

Het werkt de kaartnummers bij op accountnummers, maar de accountnummers worden vervangen door null


1, Autoriteit 100%

Ik geloof een UPDATE FROMmet een JOINhelpt:

MS SQL

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

MySQL en MariaDB

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

Antwoord 2, autoriteit 20%

De eenvoudige manier om de inhoud van de ene tabel naar de andere te kopiëren is als volgt:

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

U kunt ook de voorwaarde toevoegen om de specifieke gegevens gekopieerd te krijgen.


Antwoord 3, autoriteit 11%

Voor SQL Server 2008 + Het gebruik van MERGEin plaats van de propriëtaire UPDATE ... FROM-syntaxis heeft enige aantrekkingskracht.

Het is niet alleen standaard SQL en dus draagbaarder, het zal ook een fout opleveren in het geval dat er meerdere samengevoegde rijen zijn aan de bronzijde (en dus meerdere mogelijke verschillende waarden om te gebruiken in de update) in plaats van de definitieve resultaat niet deterministisch zijn.

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

Helaas komt de keuze om te gebruiken misschien niet alleen neer op de voorkeursstijl. De implementatie van MERGEin SQL Server is geplaagd door verschillende bugs. Aaron Bertrand heeft een lijst samengesteld van de gerapporteerde hier.


Antwoord 4, autoriteit 8%

Algemeen antwoord voor toekomstige ontwikkelaars.

SQL-server

UPDATE 
     t1
SET 
     t1.column = t2.column
FROM 
     Table1 t1 
     INNER JOIN Table2 t2 
     ON t1.id = t2.id;

Oracle (en SQL Server)

UPDATE 
     t1
SET 
     t1.colmun = t2.column 
FROM 
     Table1 t1, 
     Table2 t2 
WHERE 
     t1.ID = t2.ID;

MySQL

UPDATE 
     Table1 t1, 
     Table2 t2
SET 
     t1.column = t2.column 
WHERE
     t1.ID = t2.ID;

Antwoord 5, autoriteit 3%

Voor PostgreSQL:

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

Antwoord 6, autoriteit 2%

Het lijkt erop dat u MSSQL gebruikt, en als ik het me goed herinner, gaat het als volgt:

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

Antwoord 7, autoriteit 2%

Ik had hetzelfde probleem met foo.newingesteld op nullvoor rijen van foodie geen overeenkomende sleutel hadden in bar. Ik deed zoiets als dit in Oracle:

update foo
set foo.new = (selecteer bar.new
         van bar
         waarbij foo.key = bar.key)
waar bestaat (selecteer 1
       van bar
       waarbij foo.key = bar.key)

Antwoord 8, autoriteit 2%

Dit is wat voor mij werkte in SQL Server:

UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];

Antwoord 9, autoriteit 2%

Voor MySql werkt dat prima:

UPDATE
    Sales_Import SI,RetrieveAccountNumber RAN
SET
    SI.AccountNumber = RAN.AccountNumber
WHERE
    SI.LeadID = RAN.LeadID

Antwoord 10

Bedankt voor de reacties. Ik heb een oplossing gevonden.

UPDATE Sales_Import 
SET    AccountNumber = (SELECT RetrieveAccountNumber.AccountNumber 
                          FROM   RetrieveAccountNumber 
                          WHERE  Sales_Import.leadid =RetrieveAccountNumber.LeadID) 
WHERE Sales_Import.leadid = (SELECT  RetrieveAccountNumber.LeadID 
                             FROM   RetrieveAccountNumber 
                             WHERE  Sales_Import.leadid = RetrieveAccountNumber.LeadID)  

Antwoord 11

In het geval dat de tabellen in een andere database staan. (MSSQL)

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito
FROM database1..Ciudad c1
 inner join 
  database2..Ciudad c2 on c2.CiudadID=c1.CiudadID

12

MS SQL

UPDATE  c4 SET Price=cp.Price*p.FactorRate FROM TableNamea_A c4
inner join TableNamea_B p on c4.Calcid=p.calcid 
inner join TableNamea_A cp on c4.Calcid=cp.calcid 
WHERE c4..Name='MyName';

Oracle 11G

       MERGE INTO  TableNamea_A u 
        using
        (
                SELECT c4.TableName_A_ID,(cp.Price*p.FactorRate) as CalcTot 
                FROM TableNamea_A c4
                inner join TableNamea_B p on c4.Calcid=p.calcid 
                inner join TableNamea_A cp on c4.Calcid=cp.calcid 
                WHERE p.Name='MyName' 
        )  rt
        on (u.TableNamea_A_ID=rt.TableNamea_B_ID)
        WHEN MATCHED THEN
        Update set Price=CalcTot  ;

13

De onderstaande sql die iemand heeft voorgesteld, werkt niet in SQL Server. Deze syntaxis herinnert me aan mijn oude schoolklasse:

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

Alle andere zoekopdrachten met NOT INof NOT EXISTSworden niet aanbevolen. NULL’s verschijnen omdat OP de volledige dataset vergelijkt met een kleinere subset, dan zal er natuurlijk een matchingsprobleem zijn. Dit moet worden opgelost door de juiste SQL te schrijven met de juiste JOINin plaats van het probleem te ontwijken door NOT INte gebruiken. U kunt andere problemen tegenkomen door in dit geval NOT INof NOT EXISTSte gebruiken.

Mijn stem voor de bovenste, wat een conventionele manier is om een tabel bij te werken op basis van een andere tabel door lid te worden van SQL Server. Zoals ik al zei, je kunt geen twee tabellen gebruiken in dezelfde UPDATE-instructie in SQL Server, tenzij je ze eerst samenvoegt.


Antwoord 14

update van de ene tafel naar de andere tafel op id die overeenkomt

UPDATE 
     TABLE1 t1, 
     TABLE2 t2
SET 
     t1.column_name = t2.column_name 
WHERE
     t1.id = t2.id;

Antwoord 15

update binnen dezelfde tabel:

 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

Antwoord 16

het werkt met postgresql

UPDATE application
SET omts_received_date = (
    SELECT
        date_created
    FROM
        application_history
    WHERE
        application.id = application_history.application_id
    AND application_history.application_status_id = 8
);

Antwoord 17

Dit is de gemakkelijkste en beste die Mysql en Maria DB ooit hebben gezien

UPDATE table2, table1 SET table2.by_department = table1.department WHERE table1.id = table2.by_id

Opmerking: als u de volgende fout tegenkomt op basis van uw Mysql/Maria DB-versie “Foutcode: 1175. U gebruikt de veilige update-modus en u probeerde een tabel bij te werken zonder een WHERE die een KEY-kolom gebruikt Om de veilige modus uit te schakelen , schakel de optie in Voorkeuren”

Voer de code vervolgens als volgt uit

SET SQL_SAFE_UPDATES=0;
UPDATE table2, table1 SET table2.by_department = table1.department WHERE table1.id = table2.by_id

Antwoord 18

Ik dacht dat dit een eenvoudig voorbeeld was, misschien dat iemand het gemakkelijker kan krijgen,

       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

Antwoord 19

MYSQL(Dit is mijn favoriete manier om allespecifieke kolom reasonIdwaarden te herstellen, gebaseerd op primaire sleutel idgelijkwaardigheid)

UPDATE `site` AS destination  
INNER JOIN `site_copy` AS backupOnTuesday 
      ON backupOnTuesday.`id` = destination.`id`
SET destdestination.`reasonId` = backupOnTuesday.`reasonId`

Antwoord 20

probeer dit:

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

Antwoord 21

Oracle 11g

merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;

Antwoord 22

Hiermee kunt u een tabel bijwerken op basis van de kolomwaarde die niet in een andere tabel wordt gevonden.

   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
    )

Hiermee wordt een tabel bijgewerkt op basis van de kolomwaarde die in beide tabellen wordt gevonden.

   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
    )

Antwoord 23

Ik wil nog iets extra’s toevoegen.

Werk een waarde niet bij met dezelfde waarde, dit genereert extra logboekregistratie en onnodige overhead.
Zie onderstaand voorbeeld – het zal de update alleen uitvoeren op 2 records ondanks het koppelen op 3.

DROP TABLE #TMP1
DROP TABLE #TMP2
CREATE TABLE #TMP1(LeadID Int,AccountNumber NVarchar(50))
CREATE TABLE #TMP2(LeadID Int,AccountNumber NVarchar(50))
INSERT INTO #TMP1 VALUES
(147,'5807811235')
,(150,'5807811326')
,(185,'7006100100007267039');
INSERT INTO #TMP2 VALUES
(147,'7006100100007266957')
,(150,'7006100100007267039')
,(185,'7006100100007267039');
UPDATE A
SET A.AccountNumber = B.AccountNumber
FROM
    #TMP1 A 
        INNER JOIN #TMP2 B
        ON
        A.LeadID = B.LeadID
WHERE
    A.AccountNumber <> B.AccountNumber  --DON'T OVERWRITE A VALUE WITH THE SAME VALUE
SELECT * FROM #TMP1

Antwoord 24

Als bovenstaande antwoorden niet werken, probeer dit dan

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

Other episodes