හැඳුනුම්පත් ගැලපීමක් මත පදනම්ව එක් වගුවක සිට තවත් වගුවකට SQL යාවත්කාලීන කිරීම


945

මට account numbersසහ සමඟ දත්ත සමුදායක් ඇත card numbers. මම මේවා updateඕනෑම කාඩ්පත් අංකයකට ගිණුම් අංකයට ගැලපේ , එවිට මම වැඩ කරන්නේ ගිණුම් අංක සමඟ පමණි.

ගිණුම හා කාඩ්පත් දත්ත ගබඩාවට Table IDසම්බන්ධ කිරීම සහ අදාළ ගිණුම් අංකය ආපසු ලබා දීම සඳහා මම දර්ශනයක් නිර්මාණය කළ අතර , දැන් ගිණුම් අංකය සමඟ හැඳුනුම්පත ගැලපෙන තැන එම වාර්තා යාවත්කාලීන කළ යුතුය.

ක්ෂේත්‍රය යාවත්කාලීන කළ යුතු Sales_Importවගුව මෙයයි account number:

LeadID  AccountNumber
147         5807811235
150         5807811326
185         7006100100007267039

හා, මේ වනාහි RetrieveAccountNumberමට සිට යාවත්කාලීන කිරීමට අවශ්ය වූ මේසය,:

LeadID  AccountNumber
147         7006100100007266957
150         7006100100007267039

මම පහත උත්සාහ කළෙමි, නමුත් මෙතෙක් වාසනාවක් නැත:

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

එය කාඩ්පත් අංක ගිණුම් අංක වෙත යාවත්කාලීන කරයි, නමුත් ගිණුම් අංක මගින් ප්‍රතිස්ථාපනය වේ NULL

Answers:


1392

මම විශ්වාස කරනවා UPDATE FROMසමඟ JOINකැමැත්ත උදව්:

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 සහ MariaDB

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

18
UPDATE වගන්තියේ වගු අන්වර්ථය භාවිතා කිරීමට ඔබට අවශ්‍ය විය හැකිය, එසේ නොමැතිනම් ඔබ ඕනෑම වේලාවක ස්වයංව මේසයට සම්බන්ධ වුවහොත් එය ගැටළු ඇති කරයි.
ටොම් එච්

15
කුලකයේ ඔබ වෙනස් SI.AccountNumberවිය යුත්තේ AccountNumberවෙනත් ආකාරයකින් එය අසාර්ථක වනු ඇත.
ආරොන්එල්එස්

1
MS-Access JOIN ප්‍රකාශය සමඟ වෙනස් යාවත්කාලීන කිරීමක් භාවිතා කරයි. බලන්න: sql-und-xml.de/sql-tutorial/…
Christian Ammer

92
මෙය mssql සඳහා හොඳ බව පෙනේ, නමුත් mysql හි වැඩ කරන බවක් නොපෙනේ. මෙය කාර්යය කරන බව පෙනේ : UPDATE Sales_Import, RetrieveAccountNumber SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;. මාතෘකාවෙන් මඳක් බැහැර නමුත් ප්‍රයෝජනවත් විය හැකිය
එඩ්

7
මම හිතන්නේ අභ්‍යන්තර සම්බන්ධතාවයේ අවශ්‍යතාවයක් නැහැ. ක්රියා පහත Vonki විසඳුම: UPDATE [Sales_Lead] [dbo] [Sales_Import] SET [AccountNumber] = RetrieveAccountNumber.AccountNumber RetrieveAccountNumber කොතැනින්ද [Sales_Lead] සිට [dbo] [Sales_Import] .LeadID = RetrieveAccountNumber.LeadID....
Gutti

293

එක් වගුවක සිට තවත් වගුවකට අන්තර්ගතය පිටපත් කිරීමේ සරල ක්‍රමය පහත පරිදි වේ:

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

විශේෂිත දත්ත පිටපත් කිරීම සඳහා ඔබට කොන්දේසිය එකතු කළ හැකිය.


2
මෙය ක්‍රියාත්මක වේ, නමුත් ඔබට යාවත්කාලීන වගුවේ 2 වගුව 2 වගුව අවශ්‍ය නොවේ. SET table2.col1 = table1.col1, table2.col2 = table1.col2, ... table1 වෙතින් WHERE table1.memberid = table2.memberid
Sirentec

2
මෙය ක්‍රියාත්මක වූයේ නැත, නමුත් යාවත්කාලීන වගුව 2, වගුව 1 SET table2.col1 = table1.col1, ... WHERE table1.memberid = table2.memberid (mysql සහ phpmyadmin)
ටොම් කුෂෙල්

156

SQL සේවාදායකය සඳහා 2008 + MERGEහිමිකාර UPDATE ... FROMසින්ටැක්ස් වෙනුවට භාවිතා කිරීම යම් ආයාචනයක් ඇත.

සම්මත SQL වීම මෙන්ම වඩාත් අතේ ගෙන යා හැකි වන අතර, අවසාන ප්‍රති result ලය අවිනිශ්චිතතාවයට වඩා ප්‍රභව පැත්තේ බහුවිධ පේළි ඇති විට (සහ යාවත්කාලීනයේදී භාවිතා කළ හැකි විවිධ අගයන් බහුවිධ) දෝෂයක් මතු කරයි. .

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

අවාසනාවකට මෙන් කුමන තේරීම භාවිතා කළ යුතුද යන්න හුදෙක් කැමති ශෛලියට නොගැලපේ. MERGESQL සේවාදායකයේ ක්‍රියාත්මක කිරීම විවිධ දෝෂ වලින් පීඩා විඳිති. ආරොන් බර්ට්‍රන්ඩ් විසින් මෙහි වාර්තා කරන ලද අයගේ ලැයිස්තුවක් සම්පාදනය කර ඇත .


11
ඉදිරියට යන්න MERGE.
ජකුබ් ජනුස්කිවික්ස්

2
ඒකාබද්ධ කිරීමේ වාක්‍ය ඛණ්ඩය ගැන මම කිසි විටෙකත් දැන සිටියේ නැත. යාවත්කාලීන + බැඳීමට වඩා එය පිරිසිදුයි.
ටෝනි Ash ෂ්වර්ත්

MERGE SQL සේවාදායකය ක්‍රියාත්මක කිරීම වාර්තා කිරීම සඳහා +1
AFract

1
MERGE භාවිතා කිරීම සඳහා වන තර්ක ( ඉහත සබැඳි sqlblog.com වෙතින් ඇතුළුව ) බලවත් විය හැකි නමුත් සලකා බැලිය යුතු එක් කරුණක් විය හැක්කේ MSDN ට අනුව : ... වගු දෙකෙහි සංකීර්ණ මිශ්‍රණයක් ඇති විට MERGE ප්‍රකාශය වඩාත් හොඳින් ක්‍රියාත්මක වේ. ගැලපෙන ලක්ෂණ ... එක් වගුවක් තවත් වගුවක පේළි මත පදනම්ව යාවත්කාලීන කරන විට, මූලික INSERT, UPDATE, සහ DELETE ප්‍රකාශ මගින් වැඩි දියුණු කළ ක්‍රියාකාරිත්වය සහ පරිමාණය ලබා ගත හැකිය
ටෝනි පුලෝකාස්

1
question jkp1187 මෙම ප්‍රශ්නය SQL සේවාදායකය ලෙස සලකුණු කර ඇත. එබැවින් RE: FWIW - දළ වශයෙන් ශුන්‍ය වේ.
මාටින් ස්මිත්

109

අනාගත සංවර්ධකයින් සඳහා පොදු පිළිතුර.

SQL සේවාදායකය

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

ඔරකල් (සහ SQL සේවාදායකය)

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;

2
අවම වශයෙන් SQL සේවාදායකය සඳහා, ඉහළ යාවත්කාලීන වගන්තියේ ( update t1...වෙනුවට update Table1...) වගුවේ නමට වඩා අන්වර්ථය භාවිතා කරන්න
gordon

38

PostgreSQL සඳහා:

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

මම කරන වැරැද්ද නම්: SET SI.AccountNumber = RAN.AccountNumber. තවමත්, postgresql හි එය වැරදි වන්නේ මන්දැයි මම කල්පනා කරමි. කිසිවෙකුට පැහැදිලි කළ හැකිද?
කරන් අරෝරා

35

ඔබ MSSQL භාවිතා කරන බව පෙනේ, එසේ නම්, මට නිවැරදිව මතක නම්, එය සිදු කරන්නේ මේ ආකාරයට ය:

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

මෙය පළමු උත්සාහයෙන් ස්තූතියි!
මයිකල් ලාර්සන්

34

ගැලපෙන යතුරක් නොමැති පේළි සඳහා foo.newසැකසීමේ ගැටලුව මට තිබුණි . මම ඔරකල්හිදී මේ වගේ දෙයක් කළා:nullfoobar

යාවත්කාලීන foo
foo.new = සකසන්න (bar.new තෝරන්න
                  තීරුවෙන් 
                  එහිදී foo.key = bar.key)
පවතින තැන (1 තෝරන්න
              තීරුවෙන්
              එහිදී foo.key = bar.key)

4
ඇයි ඇත කොතැනින්ද පවතී අවශ්ය ද?
ජෝර්ජ් ෂෝලි

7
මන්ද යත්, foo හි සෑම පේළියක්ම බාර්එකක් තුළ තරඟයක් නොතිබීම නිසා තෝරාගත් ප්‍රකාශය ශුන්‍ය වූ බැවිනි. එය පැහැදිලි කිරීමට මා ගත් පළමු උත්සාහයට වඩා මෙය පැහැදිලි යැයි සිතමි.
Kjell Andreassen

මෙම පිළිතුර පහත දැක්වේ stackoverflow.com/questions/224732/…
බෂීර් අල්-මොමානි

JKjellAndreassen ඔබ මගේ ප්‍රශ්නය විසඳුවා. ඔබගේ කේතයට ස්තූතියි.
භවින් තුම්මර්

28

SQL සේවාදායකයේ මා වෙනුවෙන් වැඩ කළ දේ මෙන්න:

UPDATE [AspNetUsers] SET

[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]

FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];

27

හොඳින් ක්‍රියාත්මක වන MySQL සඳහා:

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

18

ප්‍රතිචාර වලට ස්තූතියි. මම විසඳුමක් සොයාගත්තා.

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)  

17
මෙහි කේතය ක්‍රියාත්මක වුවද නැතත්, ඔබ පළ කර ඇති අනෙක් විසඳුම් දෙක දෙස බැලිය යුතුය. ඒවා වඩා පැහැදිලිය, දෝෂ වලට ගොදුරු වීමේ ප්‍රවණතාව අඩුය.
ටොම් එච්

3
මෙම විසඳුම පිළිබඳ සටහනක් පමණක් යාවත්කාලීන කරන්න ... FROM හිමිකාරී වේ, එබැවින් ඔබ SQL 2005 හෝ ඊට පෙර භාවිතා කරන නිසා ඔබට MERGE ප්‍රකාශය භාවිතා කළ නොහැකි නම්, මෙය MSSQL හි වගු ප්‍රභවයක් සමඟ යාවත්කාලීන කිරීම් සිදුකිරීමේ ANSI- අනුකූල ක්‍රමයකි. මුලාශ්‍රය: sqlblog.com/blogs/hugo_kornelis/archive/2008/03/10/…
ව්‍යාජ

1
මට වැඩ කරන එකම විසඳුම වන්නේ එහි සම්මත SQL යාවත්කාලීන ප්‍රකාශය (UPDATE SET WHERE), ස්තූතියි
alot

14

වගු වෙනත් දත්ත සමුදායක තිබේ නම්. (MSSQL)

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito

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

11

හැඳුනුම්පත මත පදනම්ව Table2 සමඟ Table1 යාවත්කාලීන කිරීමට පහත විමසුම් කොටස භාවිතා කරන්න:

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

මෙම ගැටළුව විසඳීමට ඇති පහසුම ක්‍රමය මෙයයි.


8

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';

ඔරකල් 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  ;

3

එකම වගුව තුළ යාවත්කාලීන කරන්න:

  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

3

පහත දැක්වෙන SQL යමෙකු යෝජනා කළ පරිදි, SQL සේවාදායකයේ ක්‍රියා නොකරයි. මෙම වාක්‍ය ඛණ්ඩය මගේ පැරණි පාසල් පන්තිය මට මතක් කර දෙයි:

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

භාවිතා කරන NOT INහෝ NOT EXISTSනිර්දේශ නොකරන අනෙකුත් සියලුම විමසුම් . OP මුළු දත්ත කට්ටලයම කුඩා උප කුලකයක් සමඟ සංසන්දනය කරන නිසා NULLs පෙන්වයි, එවිට ඇත්ත වශයෙන්ම ගැලපෙන ගැටළුවක් ඇත. JOINගැටළුව නිවැරදි කිරීම වෙනුවට නිවැරදි SQL නිවැරදිව ලිවීමෙන් මෙය නිවැරදි කළ යුතුය NOT IN. මෙම අවස්ථාව භාවිතා කිරීමෙන් NOT INහෝ භාවිතා කිරීමෙන් ඔබට වෙනත් ගැටළු වලට මුහුණ දිය හැකිය NOT EXISTS.

SQL සේවාදායකයට සම්බන්ධ වීමෙන් වෙනත් වගුවක් මත පදනම්ව වගුවක් යාවත්කාලීන කිරීමේ සම්ප්‍රදායික ක්‍රමය වන ඉහළම එක සඳහා මගේ ඡන්දය. මා කීවාක් මෙන්, ඔබ UPDATEමුලින්ම සම්බන්ධ නොවන්නේ නම් ඔබට SQL සේවාදායකයේ එකම ප්‍රකාශයේ වගු දෙකක් භාවිතා කළ නොහැක .


2
මට කිව හැක්කේ SQL Server 2017 හි මෙය හොඳින් ක්‍රියාත්මක වන බවයි. අනාගත පුද්ගලයින් සඳහා සටහනක් ලෙස. ඔවුන් හා සම්බන්ධ වීමට අවශ්‍ය නැත.
ෂාප්ෂේඩ්

3

එය 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
);

1

යමෙකුට එය පහසු කර ගත හැකි සරල උදාහරණයක් යැයි මම සිතුවෙමි,

        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

0

ඔරකල් 11g

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

-1

වෙනත් වගුවක ඇති තීරු අගය මත පදනම්ව වගුවක් යාවත්කාලීන කිරීමට මෙය ඔබට ඉඩ සලසයි.

    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
    )

මෙය වගු දෙකෙහිම ඇති තීරු අගය මත පදනම්ව වගුවක් යාවත්කාලීන කරනු ඇත.

    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
    )

-1

මේක උත්සාහ කරන්න :

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

-2

මම තවත් එක් දෙයක් එකතු කිරීමට කැමතියි.

එකම අගයක් සහිත අගයක් යාවත්කාලීන නොකරන්න, එය අමතර ල ging ු-සටහන් සහ අනවශ්‍ය පොදු කාර්ය ජනනය කරයි. පහත උදාහරණය බලන්න - එය යාවත්කාලීන කිරීම සිදු කරන්නේ වාර්තා 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

-3

ඉහත පිළිතුරු ඔබ වෙනුවෙන් ක්‍රියා නොකරන්නේ නම් මෙය උත්සාහ කරන්න

Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
Set A.AccountNumber = B.AccountNumber
where A.LeadID = B.LeadID 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.