আইডি ম্যাচের উপর ভিত্তি করে এক টেবিল থেকে অন্য সারণীতে এসকিউএল আপডেট


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উইল দিয়ে সাহায্য করবে:

এমএস এসকিউএল

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

মাইএসকিউএল এবং মারিয়াডিবি

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

18
আপনি আপডিজ ক্লজটিতে টেবিলের ওরফে ব্যবহার করতে চাইতে পারেন, অন্যথায় যদি আপনি কোনও সময়ে টেবিলে স্বতঃসংশ্লিষ্ট হন তবে এটি সমস্যার কারণ হতে পারে।
টম এইচ

15
সেট ধারাটিতে আপনার অন্যথায় এটি ব্যর্থ হবে SI.AccountNumberঠিক তে পরিবর্তন করা উচিত AccountNumber
অ্যারোনএলএস

1
এমএস-অ্যাক্সেস যোগদানের বিবৃতি সহ একটি পৃথক আপডেট আপডেট করে। এক নজরে
ক্রিশ্চিয়ান আমার

92
এটি এমএসকিউএল-এর পক্ষে ভাল বলে মনে হচ্ছে তবে এটি মাইএসকিএলে কাজ করবে বলে মনে হচ্ছে না। এই যদিও কাজ বলে মনে হয়: UPDATE Sales_Import, RetrieveAccountNumber SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;। সামান্য বিষয় ছাড়াই তবে সহায়ক হতে পারে
এডিড

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
এটি কাজ করে, তবে আপনার থেকে টেবিল 2 দরকার নেই আপডেট টেবিল 2 সেট টেবিল 2 কোল 1 = টেবিল 1 কোল 1, টেবিল 2 কোল = টেবিল 1 কোল 2, ... টেবিল 1 কোথা থেকে টেবিল 1.মেম্বারিড = টেবিল
2.

2
এটি কার্যকর হয়নি, তবে টেবিল 2 আপডেট করুন, টেবিল 1 সেট টেবিল 2.col1 = টেবিল 1 কোল 1, ... কোথায় টেবিল 1.মেম্বারিড = টেবিল 2.মিমিডিড (মাইএসকিএল এবং phpmyadmin)
টম কুশেল

156

এসকিউএল সার্ভারের জন্য 2008 + MERGEমালিকানার চেয়ে ব্যবহার করাUPDATE ... FROM সিনট্যাক্সের কিছু আবেদন রয়েছে।

পাশাপাশি স্ট্যান্ডার্ড এসকিউএল হওয়ার পাশাপাশি আরও পোর্টেবল এটি চূড়ান্ত ফলাফলকে স্থির করার পরিবর্তে উত্সের পাশে একাধিক যোগদানকারী সারি হওয়ার (এবং এভাবে আপডেটে একাধিক সম্ভাব্য বিভিন্ন মানগুলি ব্যবহার করার ক্ষেত্রে) ত্রুটি বাড়াবে will ।

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

দুর্ভাগ্যক্রমে কোনটি বেছে নিন তা পছন্দসই স্টাইলে নিখুঁতভাবে নেমে আসবে না। MERGEএসকিউএল সার্ভারের বাস্তবায়নটি বিভিন্ন বাগের সাথে সংক্রামিত হয়েছে। অ্যারন বারট্রান্ড এখানে রিপোর্ট করাগুলির একটি তালিকা তৈরি করেছেন


11
জন্য সতর্কতা MERGE
জাকুব জানুসকিউইচিজ

2
মার্জ সিনট্যাক্স সম্পর্কে আমি কখনই জানতাম না। এটি আপডেট + যোগ দেওয়ার চেয়ে অনেক বেশি ক্লিনার।
টনি আশওয়ার্থ


1
মার্জ ব্যবহারের জন্য যুক্তিগুলি ( উপরের লিঙ্কযুক্ত sqlblog.com থেকে পোস্টে অন্তর্ভুক্ত ) বোধগম্য হতে পারে তবে একটি বিষয় বিবেচনা করার জন্য এটি হতে পারে এমএসডিএন অনুসারে : ... দুটি টেবিলে একটি জটিল মিশ্রণ থাকলে মার্জ স্টেটমেন্টটি সবচেয়ে ভাল কাজ করে ম্যাচের বৈশিষ্ট্যগুলি ... যখন অন্য টেবিলের সারিগুলির ভিত্তিতে কেবল একটি টেবিলটি আপডেট করা হয় তখন বুনিয়াদী INSERT, আপডেট এবং
ডিলেট

1
@ jkp1187 এই প্রশ্নটি এসকিউএল সার্ভার ট্যাগ করেছে। সুতরাং RE: FWIW - প্রায় শূন্য।
মার্টিন স্মিথ

104

ভবিষ্যতের বিকাশকারীদের জন্য জেনেরিক উত্তর।

SQL সার্ভার

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

ওরাকল (এবং এসকিউএল সার্ভার)

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
কমপক্ষে এসকিউএল সার্ভারের জন্য উল্লেখ্য, শীর্ষ আপডেটের শর্তে ( update t1...পরিবর্তে update Table1...) টেবিলের নামের পরিবর্তে উপনামটি ব্যবহার করুন
গর্ডন

2
ওরাকল সংস্করণ কাজ করে না। ORA-00933 প্রাপ্ত হচ্ছে
ka3ak

35

PostgreSQL এর জন্য:

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

34

মনে হচ্ছে আপনি এমএসএসকিউএল ব্যবহার করছেন, তবে, যদি আমি সঠিকভাবে মনে করি তবে এটি এইভাবে করা হয়েছে:

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
foo.new = সেট করুন (বার.নেউ নির্বাচন করুন
                  বার থেকে 
                  যেখানে foo.key = bar.key)
যেখানে উপস্থিত (1 নির্বাচন করুন
              বার থেকে
              যেখানে foo.key = bar.key)

4
কেন কোথায় বিদ্যমান প্রয়োজনীয়?
জর্জি স্কলি 15

6
কারণ ফু-এর প্রতিটি সারি বারে ম্যাচ না করে নালাগুলি শেষ হয়েছে, কারণ নির্বাচনী বিবৃতিটি শূন্য করে produced আশা করি এটি ব্যাখ্যা করার ক্ষেত্রে আমার প্রথম প্রয়াসের তুলনায় এটি আরও পরিষ্কার ছিল।
কেজেল আন্দ্রেসসেন

নীচের এই উত্তর চেক stackoverflow.com/questions/224732/...
বশীর আল MOMANI

@ KjellAndreassen আপনি আমার সমস্যার সমাধান করেছেন। আপনার কোডের জন্য ধন্যবাদ।
ভাভিন থুমার

27

মাইএসকিউএল এর জন্য যা ভাল কাজ করে:

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

26

এসকিউএল সার্ভারে আমার জন্য যা কাজ করেছে তা এখানে:

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
এখানে কোডটি কাজ করে কি না, আপনার সম্ভবত পোস্ট হওয়া অন্য দুটি সমাধানের দিকে নজর দেওয়া উচিত। এগুলি তত স্পষ্ট এবং ত্রুটির প্রবণতা কম প্রায় তত দ্রুত to
টম এইচ

3
এই সমাধানটির জন্য কেবলমাত্র একটি নোট, আপডেট ... থেকে মালিকানাধীন, সুতরাং আপনি এসইকিউএল 2005 বা তার আগের ব্যবহারের কারণে আপনি যদি মার্জ স্টেটমেন্টটি ব্যবহার করতে না পারেন তবে এটি এমএসএসকিউএলে একটি সারণী উত্সের সাথে আপডেটগুলি সম্পাদন করার একটি এএনএসআই-সম্মতিজনক পদ্ধতি। সূত্র: sqlblog.com/blogs/hugo_kornelis/archive/2008/03/10/…
সিউডোকোডার

1
একমাত্র সমাধান যা আমার পক্ষে কাজ করে কারণ এটি একটি স্ট্যান্ডার্ড এসকিউএল আপডেট স্টেটমেন্ট (যেখানে
সেটআপ করুন

13

সারণীগুলি অন্য একটি ডাটাবেসে থাকে। (এমএস স্কুয়েল)

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito

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

10

আইডির উপর ভিত্তি করে টেবিল 2 সহ টেবিল 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

নীচের এসকিউএল কেউ পরামর্শ দিয়েছেন, এসকিউএল সার্ভারে কাজ করে না। এই সিনট্যাক্সটি আমাকে আমার পুরানো স্কুল ক্লাসের কথা মনে করিয়ে দেয়:

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

অন্যান্য সমস্ত প্রশ্নের ব্যবহার NOT INবা NOT EXISTSপ্রস্তাবিত নয়। NUL গুলি দেখানো হয়েছে কারণ ওপি ছোট উপসেটের সাথে পুরো ডেটাসেটের তুলনা করে, তবে অবশ্যই মিলবে সমস্যা। এটি JOINব্যবহার করে ডজিং সমস্যার পরিবর্তে সঠিক সহ সঠিক এসকিউএল লিখে ঠিক করতে হবে NOT INNOT INবা ব্যবহার করে আপনি অন্যান্য সমস্যার মধ্যে যেতে পারেনNOT EXISTS এই ক্ষেত্রে ।

শীর্ষস্থানীয়দের জন্য আমার ভোট, যা এসকিউএল সার্ভারে যোগ দিয়ে অন্য টেবিলের উপর ভিত্তি করে একটি টেবিল আপডেট করার প্রচলিত উপায়। আমি যেমন বলেছি, UPDATEএসকিউএল সার্ভারে একই বিবৃতিতে আপনি দুটি টেবিল ব্যবহার করতে পারবেন না যদি না আপনি সেগুলিতে প্রথমে যোগদান করেন।


2
আমি কেবল এটিই বলতে পারি যে এসকিউএল সার্ভার 2017 এ এটি পুরোপুরি ভালভাবে কাজ করে। ঠিক যেমনটি ভবিষ্যতের লোকদের কাছে আসছে একটি নোট note তাদের সাথে যোগ দেওয়ার দরকার নেই।
শার্পশেড

3

এটি পোস্টগ্র্যাস্কল নিয়ে কাজ করে

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 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.