ID मिलान के आधार पर एक तालिका से दूसरी तालिका में SQL अद्यतन


929

मैं के साथ एक डेटाबेस है 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

जवाबों:


1368

मेरा मानना ​​है कि 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 स्टेटमेंट के साथ एक अलग UPDATE का उपयोग करता है। इस पर एक नज़र: sql-und-xml.de/sql-tutorial/…
क्रिश्चियन आमेर

92
यह mssql के लिए ठीक लगता है, लेकिन mysql में काम नहीं करता है। हालांकि यह काम करने लगता है UPDATE Sales_Import, RetrieveAccountNumber SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;:। थोड़ा सा विषय लेकिन सहायक हो सकता है
Edd

7
मुझे लगता है कि आंतरिक जुड़ाव की कोई आवश्यकता नहीं है। काम करता है नीचे Vonki समाधान: अद्यतन [Sales_Lead] [dbo] [Sales_Import] सेट [AccountNumber] = RetrieveAccountNumber.AccountNumber RetrieveAccountNumber से कहां [Sales_Lead] [dbo] [Sales_Import] .LeadID =
Gutti

289

सामग्री को एक तालिका से दूसरी तालिका में कॉपी करने का सरल तरीका इस प्रकार है:

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

आप किसी विशेष डेटा की प्रतिलिपि बनाने के लिए शर्त भी जोड़ सकते हैं।


2
यह काम करता है, लेकिन आप अद्यतन से table2 सेट table2.col1 = table1.col1, table2.col2 = table1.col2 में table2 जरूरत नहीं है, ... से table1 कहां table1.memberid = table2.memberid
Sirentec

2
यह काम नहीं किया, लेकिन तालिका 2, टेबल 1 सेट टेबल 2.col1 = table1.col1, ... WHERE table1.memberid = table2.memberid (mysql और phpmyadmin)
टॉम किस्केल

156

SQL सर्वर 2008 + के MERGEलिए मालिकाना UPDATE ... FROMसिंटैक्स के बजाय का उपयोग कुछ अपील है।

एसक्यूएल के मानक होने के साथ-साथ अधिक पोर्टेबल होने के कारण यह उस स्थिति में भी त्रुटि पैदा करेगा जब स्रोत की तरफ से कई सम्मिलित पंक्तियाँ (और इस प्रकार अद्यतन में उपयोग करने के लिए कई संभावित भिन्न मान) अंतिम परिणाम होने के बजाय अनिर्दिष्ट हो। ।

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

दुर्भाग्य से पसंद का उपयोग करने का विकल्प विशुद्ध रूप से पसंदीदा शैली में नहीं आ सकता है। MERGESQL सर्वर के कार्यान्वयन को विभिन्न बग्स से पीड़ित किया गया है। हारून बर्ट्रेंड ने यहां रिपोर्ट किए गए लोगों की एक सूची तैयार की है


11
के लिए सिर MERGE
जैकब जानुसज़काइविज़

2
मुझे मर्ज सिंटैक्स के बारे में कभी नहीं पता था। यह अपडेट + जॉइन की तुलना में बहुत अधिक क्लीनर है।
टोनी एशवर्थ

MERGE SQL सर्वर के कार्यान्वयन की रिपोर्टिंग के लिए +1
संक्षिप्त करें

1
MERGE का उपयोग करने के लिए तर्क ( ऊपर दिए गए sqlblog.com से पोस्ट में शामिल हैं ) सम्मोहक हो सकते हैं, लेकिन एक बात पर विचार करने के लिए MSDN के अनुसार हो सकता है : ... MERGE स्टेटमेंट सबसे अच्छा काम करता है जब दो तालिकाओं का एक जटिल मिश्रण होता है मिलान करने की विशेषताएँ ... जब किसी तालिका को किसी अन्य तालिका की पंक्तियों के आधार पर अपडेट किया जाता है, तो बेहतर प्रदर्शन और मापनीयता को मूलभूत INSERT, UPDATE और DELETE विवरणों के साथ प्राप्त किया जा सकता है
टोनी पुलोकस

1
@ jkp1187 इस प्रश्न को SQL सर्वर टैग किया गया है। तो आरई: एफडब्ल्यूआईडब्ल्यू - लगभग शून्य।
मार्टिन स्मिथ

104

भविष्य के डेवलपर्स के लिए सामान्य उत्तर।

एस क्यू एल सर्वर

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

Oracle (और SQL सर्वर)

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

माई एसक्यूएल

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

2
कम से कम SQL सर्वर के लिए, शीर्ष अपडेट क्लॉज में टेबल नाम के बजाय उपनाम का उपयोग करें ( update t1...इसके बजाय update Table1...)
gordon

2
Oracle संस्करण काम नहीं करता है। ORA-00933
ka3ak

35

PostgreSQL के लिए:

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

34

ऐसा लगता है कि आप MSSQL का उपयोग कर रहे हैं, तो, अगर मुझे सही याद है, तो यह इस तरह किया जाता है:

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

33

मैं एक ही समस्या है कि पंक्तियों के लिए foo.newसेट किया जा रहा था कि कोई मिलान कुंजी में नहीं था । मैंने ओरेकल में ऐसा कुछ किया:nullfoobar

अद्यतन फू
foo.new = सेट करें (bar.new चुनें
                  बार से 
                  जहां foo.key = bar.key)
जहां मौजूद है (1 चुनें
              बार से
              जहां foo.key = bar.key)

4
क्यों है कहां मौजूद है की आवश्यकता?
जॉर्ज शॉली

6
क्योंकि फू में प्रत्येक पंक्ति बार में एक मैच नहीं होने के कारण समाप्त हो गई है, क्योंकि चयन कथन शून्य उत्पन्न करता है। आशा है कि यह समझाने के मेरे पहले प्रयास की तुलना में यह स्पष्ट था।
केजेल एंड्रियासेन

इस उत्तर को नीचे दिए गए stackoverflow.com/questions/224732/… पर देखें
बशीर AL-MOMANI

@KjellAndreassen आपने मेरी समस्या हल कर दी है। आपके कोड के लिए धन्यवाद।
भाविन थुम्मर

27

MySql के लिए जो ठीक काम करता है:

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

26

यहाँ SQL सर्वर में मेरे लिए क्या काम किया गया है:

UPDATE [AspNetUsers] SET

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

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

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 मालिकाना है, इसलिए यदि आप MERGE कथन का उपयोग नहीं कर सकते हैं क्योंकि आप SQL 2005 या उससे पहले का उपयोग कर रहे हैं, तो यह MSSI में तालिका स्रोत के साथ अद्यतन करने का एक ANSI- अनुरूप तरीका है। स्रोत: sqlblog.com/blogs/hugo_kornelis/archive/2008/03/10/…
pseudocoder

1
एकमात्र समाधान जो मेरे लिए काम करता है क्योंकि इसका एक मानक एसक्यूएल अपडेट स्टेटमेंट (अपडेट सेट), धन्यवाद बहुत
बशीर अल-मोमानी

13

मामले में टेबल एक अलग डेटाबेस में हैं। (MSSQL)

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito

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

10

ID1 पर आधारित Table2 के साथ तालिका 1 को अद्यतन करने के लिए क्वेरी के निम्नलिखित ब्लॉक का उपयोग करें:

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

यह वह जगह है सबसे आसान तरीका है इस समस्या से निपटने के लिए।


8

एमएस सकेल

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

ओरेकल 11 जी

        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अनुशंसित नहीं है। NULLs दिखाते हैं क्योंकि OP पूरे डेटासेट की तुलना छोटे उप-वर्ग से करता है, तो निश्चित रूप से मिलान की समस्या होगी। इसका JOINउपयोग करके समस्या को चकमा देने के बजाय सही एसक्यूएल के साथ सही लिखकर तय किया जाना चाहिए NOT IN। आप का उपयोग करके NOT INया अन्य समस्याओं में भाग सकते हैंNOT EXISTS इस मामले में ।

शीर्ष एक के लिए मेरा वोट, जो कि SQL सर्वर में शामिल होकर किसी अन्य तालिका के आधार पर तालिका को अपडेट करने का पारंपरिक तरीका है। जैसा कि मैंने कहा, आप UPDATESQL सर्वर में एक ही कथन में दो तालिकाओं का उपयोग नहीं कर सकते हैं जब तक कि आप उन्हें पहले शामिल नहीं करते हैं।


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

ओरेकल 11 जी

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

मैं एक अतिरिक्त बात जोड़ना चाहूंगा।

एक ही मूल्य के साथ एक मूल्य को अपडेट न करें, यह अतिरिक्त लॉगिंग और अनावश्यक ओवरहेड उत्पन्न करता है। नीचे उदाहरण देखें - यह केवल 3 पर लिंक करने के बावजूद 2 रिकॉर्ड पर अद्यतन करेगा।

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 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.