sql এসকিউএল এ যোগ দিয়ে আমি কিভাবে একটি আপডেট বিবৃতি করতে পারি?




sql-server tsql (12)

আমি SQL Server 2005 এ তার টেবিলের আপডেটটি তার 'পিতা-মাতা' টেবিল থেকে আপডেট করতে চাই, নীচে দেখুন:

বিক্রয়

id (int)
udid (int)
assid (int)

উদ

id  (int)
assid  (int)

sale.assid আপডেট করার জন্য সঠিক মান রয়েছে।

কি প্রশ্ন এই কাজ করবে? আমি একটি join চিন্তা করছি কিন্তু এটা সম্ভব হলে আমি নিশ্চিত নই।


FROM কীওয়ার্ড দিয়ে নিম্নলিখিত বিবৃতিটি যোগদান সহ একাধিক সারি আপডেট করতে ব্যবহার করা হয়

UPDATE users 
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division

এবং এমএস অ্যাক্সেস:

UPDATE ud 
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;

Teradata Aster একটি আকর্ষণীয় উপায় কিভাবে লক্ষ্য অর্জন করতে প্রস্তাব করে:

MERGE INTO ud --what trable should be updated
USING sale -- from what table/relation update info should be taken
ON ud.id = sale.udid --join condition
WHEN MATCHED THEN 
    UPDATE SET ud.assid = sale.assid; -- how to update

একাধিক টেবিল যোগদান ব্যবহার করে সরলীকৃত আপডেট ক্যোয়ারী।

   UPDATE
        first_table ft
        JOIN second_table st ON st.some_id = ft.some_id
        JOIN third_table tt  ON tt.some_id = st.some_id
        .....
    SET
        ft.some_column = some_value
    WHERE ft.some_column = 123456 AND st.some_column = 123456

দ্রষ্টব্য - first_table, second_table, third_table এবং 123_c456 মত some_column ডেমো টেবিল নাম, কলামের নাম এবং আইডি। বৈধ নাম দিয়ে তাদের প্রতিস্থাপন করুন।


এই SQL সার্ভারে কাজ করা উচিত:

update ud 
set assid = sale.assid
from sale
where sale.udid = id

PostgreSQL :

CREATE TABLE ud (id integer, assid integer);
CREATE TABLE sales (id integer, udid integer, assid integer);

UPDATE ud
SET assid = sales.assid
FROM sales
WHERE sales.id = ud.id;

মাইএসকিউএল

যদি আপনি ধারাটি ভুলে যান এবং ON অভিব্যক্তিতে সমস্ত শর্তগুলি রাখেন তবে আপনি সেরা পারফরম্যান্স পাবেন।

আমার মনে হয় এই প্রশ্নটি প্রথমেই টেবিলের সাথে যোগদান করতে হবে, তারপরে যেখানে সেটি চালানো হয়, তাই যদি যোগদান করতে যা দরকার তা হ্রাস করতে পারেন তবে ফলাফলগুলি পেতে / উপপতীত করার দ্রুততম উপায়।

উদাহরণ

দৃশ্যপট

আপনি ব্যবহারকারীদের একটি টেবিল আছে। তারা তাদের ব্যবহারকারীর নাম বা ইমেইল বা account_number ব্যবহার করে লগ ইন করতে পারেন। এই অ্যাকাউন্টগুলি সক্রিয় (1) বা নিষ্ক্রিয় (0) হতে পারে। এই টেবিলের 50000 সারি আছে

আপনি তখন ব্যবহারকারীদের একটি টেবিলে একসাথে নিষ্ক্রিয় করতে পারেন কারণ আপনি খুঁজে পেয়েছেন যে তারা সব কিছু খারাপ করেছে। তবে এই টেবিলটি ব্যবহারকারী নাম, ইমেল এবং অ্যাকাউন্ট নম্বরগুলির সাথে এক কলাম মিশ্রিত। এটিতে একটি "has_run" সূচক রয়েছে যা এটি চালানোর সময় 1 (সত্য) সেট করতে হবে

প্রশ্ন

UPDATE users User
    INNER JOIN
        blacklist_users BlacklistUser
        ON
        (
            User.username = BlacklistUser.account_ref
            OR
            User.email = BlacklistedUser.account_ref
            OR
            User.phone_number = BlacklistUser.account_ref
            AND
            User.is_active = 1
            AND
            BlacklistUser.has_run = 0
        )
    SET
        User.is_active = 0,
        BlacklistUser.has_run = 1;

যুক্তি

যদি আমাদের কেবল OR শর্তগুলিতে যোগদান করতে হয় তবে এটি অবশ্যই প্রতিটি সারিতে 4 বার চেক করতে হবে কিনা তা দেখতে হবে, এবং সম্ভবত আরো অনেক সারি ফেরত দিতে হবে। তবে, আরো শর্তাবলী দিয়ে এটি যোগদান করার সময় তারা যদি সমস্ত শর্ত পূরণ না করে তবে অনেকগুলি সারি "বাদ দিতে" পারে।

বোনাস

এটা আরো পঠনযোগ্য। সমস্ত অবস্থার এক জায়গায় এবং সারি আপডেট এক জায়গায় হয়


আরেকটি উদাহরণ কেন এসকিউএল সত্যিই পোর্টেবল নয়।

MySQL এর জন্য এটি হবে:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

আরও তথ্যের জন্য একাধিক টেবিল আপডেট পড়ুন: http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]

একটি স্ট্যান্ডার্ড এসকিউএল পদ্ধতির হবে

UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)

এসকিউএল সার্ভারে আপনি একটি যোগদান ব্যবহার করতে পারেন

UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id

সিনট্যাক্সটি আপনি যে SQL DBMS ব্যবহার করছেন তা কঠোরভাবে নির্ভর করে। এএনএসআই / আইএসওতে এটি করার কিছু উপায় এখানে রয়েছে (উক্কা কোনও এসকিউএল ডিবিএমএসে কাজ করা উচিত), মাইএসকিউএল, এসকিউএল সার্ভার এবং ওরাকল। আমার প্রস্তাবিত ANSI / ISO পদ্ধতি সাধারণত অন্যান্য দুটি পদ্ধতির চেয়ে অনেক ধীর হবে, তবে যদি আপনি MySQL, SQL সার্ভার বা ওরাকল ছাড়া অন্য কোনও SQL DBMS ব্যবহার করেন তবে এটি হ'ল একমাত্র উপায় (যেমন যদি আপনার SQL DBMS MERGE সমর্থন করে না):

ANSI / আইএসও:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

মাইএসকিউএল:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

SQL সার্ভার:

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

ওরাকল:

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

SQLite:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where RowID in (
      select RowID 
      from ud 
      where sale.udid = ud.id
 );

UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID

SQLite এর জন্য RowID সম্পত্তিটি আপডেট করতে ব্যবহার করুন:

update Table set column = 'NewValue'
where RowID = 
(select t1.RowID from Table t1
join Table2 t2 on t1.JoinField = t2.JoinField
where t2.SelectValue = 'FooMyBarPlease');




sql-update