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


1313

এসকিউএল সার্ভারে এর 'প্যারেন্ট' টেবিলের ডেটা সহ আমার এই টেবিলটি আপডেট করতে হবে , নীচে দেখুন:

ছক: বিক্রয়

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

টেবিল: উদ

id  (int)
assid  (int)

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

কী জিজ্ঞাসা এটি করবে? আমি একটি সম্পর্কে চিন্তা করছি joinতবে আমি নিশ্চিত কিনা এটি সম্ভব কিনা।


3
আপনি কী আরডিবিএমএস ব্যবহার করছেন? মাইএসকিউএল, এসকিউএল সার্ভার, ওরাকল, পোস্টগ্রিএসকিউএল বা অন্য কিছু?
ক্রিস জে

টেবিলের মধ্যে কিছু সম্পর্ক? কীভাবে একজন জানতে পারবেন যে বিক্রয় থেকে প্রাপ্ত রেকর্ডটি উড থেকে প্রাপ্ত রেকর্ডের সাথে মিলে যায়? এটি উভয় টেবিলে প্রাথমিক কী হিসাবে আইডি ভিত্তিক?
ক্যাটালিন পিতি

আপনি কীভাবে ইউডি আপডেট করতে পারেন? এটির কেবলমাত্র এসিড রয়েছে এবং এটির নিজস্ব আইডি। আপনি কি প্রকৃত মূল্যবোধগুলির বিদ্যমান উদাহরণগুলিতে এবং স্ক্রিপ্টের ফলাফল হিসাবে আপনি যে রেকর্ডগুলি পরিবর্তন বা যুক্ত করতে চান তা উদাহরণ দিতে পারেন?
বার্নহার্ড হফম্যান

2
আরও দেখুন তাই প্রশ্ন ... stackoverflow.com/questions/982919/sql-update-query-using-joins
SteveC

2
ব্যবহারকারী আলিয়াসের জিজ্ঞাসায় যেমন স্ট্যাকওভারফ্লো :: প্রশ্নগুলি
ইমরান মুহাম্মদ

উত্তর:


2383

সিন্ট্যাক্স আপনি কোন এসকিউএল ডিবিএমএস ব্যবহার করছেন তার উপর কঠোরভাবে নির্ভর করে। এটিএসআই / আইএসওতে করার কিছু উপায় এখানে রয়েছে (ওরফে কোনও এসকিউএল ডিবিএমএসে কাজ করা উচিত), মাইএসকিউএল, এসকিউএল সার্ভার এবং ওরাকল। পরামর্শ দিন যে আমার প্রস্তাবিত এএনএসআই / আইএসও পদ্ধতিটি সাধারণত অন্য দুটি পদ্ধতির তুলনায় অনেক ধীর হবে তবে আপনি যদি মাইএসকিউএল, এসকিউএল সার্ভার বা ওরাকল ব্যতীত কোনও এসকিউএল ডিবিএমএস ব্যবহার করেন, তবে এটির একমাত্র উপায় হতে পারে (উদাঃ) যদি আপনার এসকিউএল ডিবিএমএস সমর্থন করে না 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 ud
  set assid = s.assid
from sale s 
where ud.id = s.udid;

নোট করুন যে FROMপোস্টগ্রগ্রের জন্য ক্লজটিতে লক্ষ্য সারণীটি পুনরাবৃত্তি করা উচিত নয় ।

ওরাকল:

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

3
এটি আমার কাছে মনে হয় যে মাইএসকিউএল set assid = s.assidহওয়া উচিত set u.assid = s.assid
dotancohen

2
এএনএসআই সিনট্যাক্সে, যদি নির্বাচিতরা =একাধিক সারির চেয়ে বেশি ফেরত দেয় তবে কী হবে ?
অ্যাকাউন্টটি

2
@ ThrowawayAccount3Million এটি ব্যর্থ হবে। আফাইক, এই ধরণের অপারেশনটি একটি স্কেলারের মান প্রত্যাশা করে এবং পরিবর্তে ফলাফল সেট করা থাকলে একটি ত্রুটি ছুঁড়ে দেবে।
ফ্রান্সিস লর্ড

6
আমি আশা করি ওপি তার টেবিল এবং কলামগুলির জন্য আরও কিছু ভাল নাম চয়ন করুন !! এটি এতটা পঠনযোগ্য / স্বজ্ঞাত নয় ...
এস.সার্পুশন

4
পোস্টগ্রে 9.3 কেবলমাত্র ব্যবহার করে কাজ করেছেupdate ud set assid = s.assid
স্ট্যাকউন্ডার

143

এটি এসকিউএল সার্ভারে কাজ করা উচিত:

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

98

postgres

UPDATE table1
SET    COLUMN = value
FROM   table2,
       table3
WHERE  table1.column_id = table2.id
       AND table1.column_id = table3.id
       AND table1.COLUMN = value
       AND table2.COLUMN = value
       AND table3.COLUMN = value 

20
যদি প্রশ্নটিতে ব্যবহৃত টেবিল / কলামের নাম ব্যবহার করা হয় তবে উত্তরটি আরও সহজ হবে। আপনার উত্তরে কেন 3 টি টেবিল রয়েছে?
alfonx

50

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

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

1
প্রথমটির সাথে, আপনি 2+ কলামের সাথে মেলাতে পারবেন না, তবে দুর্দান্ত কাজ করে যোগদান করুন।
মাককিউক

6
@ ম্যাকসিউক: হাহ? আপনি WHEREঅতিরিক্ত কলামগুলিতে মেলতে চাইলে আপনি কেবলমাত্র শর্তে আরও শর্ত যুক্ত করতে পারেন।
স্যারাইড

2
কেবল একটি নিট ... তবে আমি মনে করি ওপিটির অর্থ বিক্রয়। ইউটিড = ইউডিআইডি meant এবং বিক্রয়.id.
স্কিপি ভনড্রেকে


26

সরলীকৃত আপডেট ক্যোয়ারী ব্যবহার করে JOIN একাধিক টেবিল -ing।

   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

দ্রষ্টব্য - প্রথম_সমাজ, দ্বিতীয়_সারণযোগ্য, তৃতীয়_আরক্ষীয় এবং 12_456 এর মতো কিছু_কলামটি হ'ল ডেমো সারণীর নাম, কলামের নাম এবং আইডি। তাদের বৈধ নাম দিয়ে প্রতিস্থাপন করুন।


16

এসকিউএল কেন সত্যই বহনযোগ্য নয় Another

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

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]

2
"এসকিউএল সত্যিই বহনযোগ্য নয়" মন্তব্যটিতে +1! বহনযোগ্যতা এতই নাজুক যে কেবল একটি ভেরিয়েবল ঘোষণা করা জনপ্রিয় অনেক ডাটাবেস ইঞ্জিনের মধ্যে বহনযোগ্যতা ভঙ্গ করে।
জেফ মোডেন 26'13

8

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

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

8

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

সাইব্যাসের জন্য আমি খুঁজে পেলাম যে আপডেটটি টেবিলের উপরে থাকা প্রয়োজন যা তার নাম নয়:

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

7

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

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

7

মাইএসকিউএল

আপনি যদি ক্লজটি ভুলে যান এবং সমস্ত শর্তটি অন মত প্রকাশের ক্ষেত্রে রাখেন তবে আপনি সেরা অভিনয়টি পাবেন।

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

উদাহরণ

দৃশ্যপট

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

তারপরে আপনার একসাথে অক্ষম করার জন্য ব্যবহারকারীর একটি টেবিল রয়েছে কারণ আপনি খুঁজে পেয়েছেন যে তারা সকলেই কিছু খারাপ করেছে। এই টেবিলটিতে ব্যবহারকারী নাম, ইমেল এবং অ্যাকাউন্ট নম্বর মিশ্রিত সহ একটি কলাম রয়েছে has এটিতে একটি "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;

যুক্তি

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

বোনাস

এটি আরও পঠনযোগ্য। সমস্ত শর্তগুলি এক জায়গায় এবং আপডেট করার জন্য সারিগুলি এক জায়গায়


4

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

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

1
সতর্কতা হিসাবে, এসইটি অবশ্যই রেকর্ডসেট সংজ্ঞার পরে আসতে হবে! আমি সবেমাত্র অ্যাক্সেস ডাটাবেসে একটি অনুরূপ দৃশ্যাবলী নিয়ে কাজ করার চেষ্টা করছি, যেখানে একটি পূর্ণ শর্তের প্রয়োজন (এটি এটি বৈধ ওয়ান শর্ত হিসাবে স্বীকার করবে না)। সিনট্যাক্স ত্রুটিগুলি এড়াতে সর্বশেষে কোথায় আসতে হয়েছিল।
ডডোকাফোন



3

এটি চেষ্টা করে দেখুন, আমি মনে করি এটি আপনার পক্ষে কার্যকর হবে

update ud

set ud.assid = sale.assid

from ud 

Inner join sale on ud.id = sale.udid

where sale.udid is not null

2

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

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

1
আপনি এই কিছুটা ব্যাখ্যা করতে পারেন?
মোহাম্মদ নুরাল্ডিন

1
@ মোহাম্মাদ নুরাল্ডিন ​​আমি ব্যাখ্যা করার চেষ্টা করব। সমস্যাটি কীভাবে একই টেবিলটি ব্যবহার করে কোনও যোগদানের কোনও ক্যোয়ারির ফলাফল সহ একটি টেবিল আপডেট করতে হয়। (উপ-নির্বাচন) বিবৃতিটি একটি যোগদানের মতো কাজ করে এবং একটি সিস্টেম ক্ষেত্র, RowID প্রদান করে যা একটি সারণীতে প্রতিটি সারির জন্য একটি অনন্য নম্বর। যেহেতু উপ-নির্বাচনটি একাধিক সারিগুলিকে "যেখানে RowID =" ফলিত সাব-সিলেক্ট থেকে একটি একক সঠিক সারি নির্বাচন করে এবং কলামে আপডেটটি করে তা ফিরিয়ে আনতে পারে। আপনার আরও স্পেসিফিকেশন প্রয়োজন হলে বা এই থিমটিতে কোনও ভিন্নতা বের করার দরকার রয়েছে কিনা আমাকে জানান।
কিথ দ্য বিপিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.