এসকিউএল সার্ভার 2005 এ একটি বিবৃতিতে দুটি টেবিল কীভাবে আপডেট করবেন?


193

আমি একবারে দুটি টেবিল আপডেট করতে চাই। এসকিউএল সার্ভার 2005 এ আমি কীভাবে করব?

UPDATE 
  Table1, 
  Table2
SET 
  Table1.LastName='DR. XXXXXX', 
  Table2.WAprrs='start,stop'
FROM 
  Table1 T1, 
  Table2 T2
WHERE 
  T1.id = T2.id
AND 
  T1.id = '010008'

4
আপনি যদি ব্যাখ্যা করেন তবে এটি সহায়তা করবে।
এরিক মিক্কেলসেন

2
আমি ভীত, এসকিউএল সার্ভার 2005 এক প্রশ্নের মধ্যে একাধিক সারণী আপডেট করার পক্ষে সমর্থন করে না।
প্রণব সিং

উত্তর:


194

আপনি একটি বিবৃতিতে একাধিক টেবিল আপডেট করতে পারবেন না, তবে দুটি UPDATEবিবৃতি পরমাণুর সাথে চিকিত্সা করা হয়েছে তা নিশ্চিত করতে আপনি কোনও লেনদেন ব্যবহার করতে পারেন । রাউন্ড ট্রিপ এড়াতে আপনি তাদের ব্যাচ করতে পারেন।

BEGIN TRANSACTION;

UPDATE Table1
  SET Table1.LastName = 'DR. XXXXXX' 
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';

UPDATE Table2
SET Table2.WAprrs = 'start,stop'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';

COMMIT;

আসলে, আমি এই দুটি টেবিলের রেকর্ড অন্য প্রলোভনীয় থেকে আপডেট করছি। প্রলোভনীয় টেবিল 1 এর সাথে লিখিত আছে তবে টেবিল 2 নয়। আমি কীভাবে টেবিল 2 এর একই রেকর্ডটি আপডেট করতে পারি? কীভাবে এটি যুক্ত করব?
জাঙ্গো

@ অজানা: আপনার মন্তব্যের উপর ভিত্তি করে, আপনি যখন টেবিল 2 আপডেট করেন তখন আপনার টেবিল 1 এবং টেবিল 2 উভয় জুড়েই আপনাকে যোগ দিতে হবে যদি আপনার আপডেট কোয়েরিতে কোনও তৃতীয় টেবিলের কীগুলি প্রয়োজন। তা নির্বিশেষে, আপনার এখনও দুটি পৃথক আপডেট করতে হবে।
এল বুশকিন

3
সম্ভবত সম্পর্কিত নয়: এটি এমওয়াইএসকিউএলে কাজ করবে না কারণ মাইএসকিএল-র আপডেট সিনট্যাক্স ভিন্ন। আপনাকে টেবিল 1 আপডেট করতে হবে, টেবিল 2 সেট টেবিল 1.লাস্টনেম = 'ডিআর। XXXXXX 'WHERE T1.id = T2.id
হুয়ান ভিলার

তাদের মধ্যে কী আমাদের কী কী এবং বৈদেশিক কী সম্পর্ক বজায় রাখতে হবে
শ্রীনবাস গওদা

2
কোনও ত্রুটির ক্ষেত্রে আংশিক আপডেট এড়াতে আপনার আপডেট স্টেটমেন্টগুলি চেষ্টা / ক্যাপ ব্লকের ভিতরে রাখা উচিত। এই প্রশ্নটি দেখুন: স্ট্যাকওভারফ্লো.com
mechatroner

84

আপনি একবারে দুটি টেবিল আপডেট করতে পারবেন না তবে আপনি কোনও ব্যবহার সন্নিবেশের সাথে একটি আপডেটের লিঙ্ক OUTPUT INTOকরতে পারেন এবং আপনি এই আউটপুটটিকে দ্বিতীয় আপডেটের জন্য যোগ হিসাবে ব্যবহার করতে পারেন:

DECLARE @ids TABLE (id int);
BEGIN TRANSACTION

UPDATE Table1 
SET Table1.LastName = 'DR. XXXXXX'  
OUTPUT INSERTED.id INTO @ids
WHERE Table1.field = '010008';

UPDATE Table2 
SET Table2.WAprrs = 'start,stop' 
FROM Table2 
JOIN @ids i on i.id = Table2.id;

COMMIT;

আমি আপনার উদাহরণের WHEREশর্তটি বাদে অন্য কোনও ক্ষেত্র হিসাবে পরিবর্তন করেছি id। যদি এটি আপনার idঅভিনব প্রয়োজন না হয় তবে আপনি এটির জন্য দ্বিতীয় সারণীটি OUTPUTকরতে পারেন ।UPDATEid='010008'


এটি সেরা উত্তর এবং আসল প্রশ্নের সত্য উত্তর হিসাবে ভোট দেওয়া উচিত। ধন্যবাদ. এটা আমার জন্য কাজ করেছে।
Fandango68

1
তা কি হওয়ার T1.fieldকথা Table1.field?
ডাব্লুএফএফ

22

দুঃখিত, আফাইক, আপনি এটি করতে পারবেন না। দুটি পৃথক সারণীতে বৈশিষ্ট্য আপডেট করার জন্য, আপনাকে দুটি পৃথক বিবৃতি কার্যকর করতে হবে। তবে তারা একটি ব্যাচে থাকতে পারে (এক রাউন্ড ট্রিপে সার্ভারে প্রেরণ করা এসকিউএলের একটি সেট)


2
ভগবন্! অতিরিক্ত কুডোর জন্য আমার প্রায়শই দুঃখিত শব্দটি ব্যবহার করা উচিত: P
Fandango68

14

এর সংক্ষিপ্ত উত্তরটি হ'ল না। আপনি যখন fromআপডেট স্টেটমেন্টের ধারাটিতে একাধিক টেবিল প্রবেশ করতে পারেন , আপনি কেবল updateকীওয়ার্ডের পরে একটি একক টেবিল নির্দিষ্ট করতে পারবেন । এমনকি যদি আপনি একটি "আপডেটযোগ্য" ভিউ লিখেন (যা কেবলমাত্র এমন কিছু মতামত যা কিছু নির্দিষ্ট বিধিনিষেধ অনুসরণ করে) তবে এর মতো আপডেটগুলি ব্যর্থ হবে। এখানে এমএসডিএন ডকুমেন্টেশন থেকে প্রাসঙ্গিক ক্লিপগুলি দেওয়া হয়েছে (জোর আমার)।

আপডেট (লেনদেন-এসকিউএল)

টেবিল_অর_ভিউ_নাম দ্বারা রেফারেন্স করা ভিউটি অবশ্যই আপডেটেড হতে হবে এবং ভিউয়ের এফআরওএম ক্লোজে ঠিক একটি বেস টেবিলটি উল্লেখ করতে হবে । হালনাগাদযোগ্য দর্শন সম্পর্কে আরও তথ্যের জন্য, দেখুন দেখুন তৈরি করুন (লেনদেন-এসকিউএল)।

ভিউ তৈরি করুন (লেনদেন-এসকিউএল)

নীচের শর্তগুলি যতক্ষণ সত্য হয় ততক্ষণ আপনি একটি ভিউয়ের মাধ্যমে অন্তর্নিহিত বেস টেবিলের ডেটা পরিবর্তন করতে পারেন:

  • আপডেট, INSERT, এবং মুছে ফেলা বিবৃতি সহ যে কোনও পরিবর্তনগুলির জন্য কেবল একটি বেস টেবিলের কলামগুলি উল্লেখ করতে হবে
  • ভিউতে সংশোধিত হওয়া কলামগুলি অবশ্যই টেবিল কলামগুলিতে অন্তর্নিহিত ডেটা সরাসরি উল্লেখ করতে হবে। কলামগুলি অন্য কোনও উপায়ে উত্পন্ন করা যায় না, যেমন নীচের মাধ্যমে:
    • একটি সামগ্রিক ফাংশন: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR, এবং VARP।
    • একটি গণনা। অন্যান্য কলাম ব্যবহার করে এমন একটি এক্সপ্রেশন থেকে কলামটি গণনা করা যায় না। সেট অপারেটর ইউনিয়ন, ইউনিয়ন অল, ক্রসজয়াইন, এক্সসিএপিটি এবং ইন্টারস্যাক্টের পরিমাণ নির্ধারণের মাধ্যমে কলামগুলি গঠিত হয় এবং এটিও আপডেটযোগ্য নয়।
  • সংশোধিত কলামগুলি GROUP BY, HAVING, বা DISTINCT ধারা দ্বারা প্রভাবিত হবে না।
  • শীর্ষস্থানীয় স্থানটি কোথাও ব্যবহারের ক্ষেত্রে নির্বাচিত বিকল্পের সাথে চেক বিকল্প বিকল্পের সাথে ব্যবহার করা হবে না।

সমস্ত সততার সাথে, যদিও, আপনাকে এলবুশকিনের উদাহরণ অনুসারে লেনদেনের মধ্যে দুটি পৃথক এসকিউএল স্টেটমেন্ট ব্যবহার করা উচিত।

আপডেট: আপনি আপডেটযোগ্য ভিউতে একাধিক টেবিল আপডেট করতে পারবেন এমন আমার আসল দাবীটি ভুল ছিল। এসকিউএল সার্ভার 2005 এবং 2012 এ এটি নিম্নলিখিত ত্রুটিটি উত্পন্ন করবে। আমি এর উত্তর প্রতিফলিত করতে আমার উত্তর সংশোধন করেছি।

Msg 4405, Level 16, State 1, Line 1

View or function 'updatable_view' is not updatable because the modification affects multiple base tables.


1
যদিও এটা সম্ভব ভিউ বস্তুর একাধিক টেবিল প্রভাবিত করবে আপডেট করার জন্য না হয় তবে আপনি তৈরি করতে পারেন পরিবর্তে ট্রিগারের যা পৃথক বিবৃতি মধ্যে মূল BREAK (প্রভাবিত এক টেবিলে প্রতিটি):INSTEAD OF Specifies that the DML trigger is executed instead of the triggering SQL statement, therefore, overriding the actions of the triggering statements. INSTEAD OF cannot be specified for DDL or logon triggers.
ভোর 4 টা

9

এটি মাইএসকিউএলের জন্য কাজ করে এবং সত্যই কেবল একটি অন্তর্নিহিত লেনদেন তবে এটির মতো কিছু হওয়া উচিত:

UPDATE Table1 t1, Table2 t2 SET 
t2.field = t2.field+2,
t1.field = t1.field+2

WHERE t1.id = t2.foreign_id and t2.id = '123414'

আপনি যদি একাধিক বিবরণী প্রয়োজন এমন একাধিক টেবিলগুলিতে আপডেট করছেন ... যা সম্ভবত যদি আপনি একটি আপডেট করেন তবে অন্য শর্তের উপর ভিত্তি করে আরেকটি ... আপনার একটি লেনদেন ব্যবহার করা উচিত। 


1
এই anser এখনও অন্যান্য ব্যবহারকারীদের জন্য প্রাসঙ্গিক।
কিসলেজিয়েরেয়েক

1
@ কিসেলিজিয়েরেেক এই উত্তরটি যে কোনও মূল্যে এড়ানো উচিত। মাইএসকিউএলে পর্যাপ্ত পরিমাণে তীক্ষ্ণ গন্ধ এবং গন্ধ রয়েছে, যার বেশিরভাগই বাস্তবে অসমর্থিত তবে ভঙ্গ কোডগুলি এড়ানোর জন্য বজায় রাখা হয় যা সেইসব গির্জার উপর নির্ভর করে। আপগ্রেড করা তাদের সহজেই ভেঙে ফেলতে পারে বা অপ্রত্যাশিত আচরণ এবং কার্য সম্পাদনের সমস্যার কারণ হতে পারে
Panagiotis Kanavos

7

আপনার লেনদেনের মধ্যে দুটি আপডেট স্টেটমেন্ট রাখা উচিত



0

আমার দৃষ্টিকোণ থেকে আপনি এটি করতে পারেন, এটির এসকিউএল সার্ভারে দুটি টেবিলের এক থেকে এক আপডেট:

 BEGIN TRANSACTION

      DECLARE @CNSREQ VARCHAR(30)
      DECLARE @ID INT
      DECLARE @CNSRQDT VARCHAR(30)
      DECLARE @ID2 INT

      DECLARE @IDCNSREQ INT
      DECLARE @FINALCNSREQ VARCHAR(30)
      DECLARE @FINALCNSRQDT VARCHAR(30)
      DECLARE @IDCNSRQDT INT


      SET @CNSREQ=(SELECT MIN(REQUISICIONESDT.CNSREQ) FROM REQUISICIONESDT
          INNER JOIN 
              REQUISICIONES
                ON REQUISICIONESDT.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
           AND REQUISICIONES.CNSREQ = REQUISICIONESDT.CNSREQ AND REQUISICIONESDT.IDREQ = REQUISICIONES.ID
        WHERE REQUISICIONES.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID)

      SELECT REQUISICIONES.CNSREQ, REQUISICIONES.ID, REQUISICIONES.CNSRQDT FROM REQUISICIONES
       INNER JOIN 
          REQUISICIONESDT
              ON REQUISICIONESDT.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
               AND REQUISICIONES.CNSREQ = REQUISICIONESDT.CNSREQ AND REQUISICIONESDT.IDREQ = REQUISICIONES.ID
        WHERE REQUISICIONES.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
    AND REQUISICIONES.CNSREQ = @CNSREQ

        UPDATE REQUISICIONESDT SET  REQUISICIONESDT.CNSREQ=NULL, REQUISICIONESDT.IDREQ=NULL
          FROM REQUISICIONES INNER JOIN REQUISICIONESDT
             ON REQUISICIONESDT.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
       WHERE REQUISICIONES.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
      AND REQUISICIONES.CNSREQ = @CNSREQ

        UPDATE REQUISICIONES SET REQUISICIONES.CNSRQDT=NULL, REQUISICIONES.IDRQDT=NULL
          FROM REQUISICIONES INNER JOIN REQUISICIONESDT
          ON REQUISICIONESDT.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
       WHERE REQUISICIONES.CNSRQDT = REQUISICIONES.CNSRQDT AND REQUISICIONES.IDRQDT = REQUISICIONESDT.ID
     AND REQUISICIONES.CNSREQ = @CNSREQ

       SET @ID2=(SELECT MIN(REQUISICIONESDT.ID) FROM REQUISICIONESDT
        WHERE ISNULL(REQUISICIONESDT.IDREQ,0)<>0)
     DELETE FROM REQUISICIONESDT WHERE REQUISICIONESDT.ID=@ID2


      SET @IDCNSREQ=(SELECT MIN (REQUISICIONES.ID)FROM REQUISICIONES
          INNER JOIN REQUISICIONESDT ON
        REQUISICIONESDT.CEDULA = REQUISICIONES.CEDULA AND REQUISICIONES.FECHA_SOLICITUD = REQUISICIONESDT.FECHA_SOLICITUD
         WHERE REQUISICIONES.CNSRQDT IS NULL AND REQUISICIONES.IDRQDT IS NULL)

        SET @FINALCNSREQ=(SELECT MIN (REQUISICIONES.CNSREQ)FROM REQUISICIONES
            INNER JOIN REQUISICIONESDT ON
        REQUISICIONESDT.CEDULA = REQUISICIONES.CEDULA AND REQUISICIONES.FECHA_SOLICITUD = REQUISICIONESDT.FECHA_SOLICITUD
         WHERE REQUISICIONES.CNSRQDT IS NULL AND REQUISICIONES.IDRQDT IS NULL)

         SET @FINALCNSRQDT=(SELECT MIN(REQUISICIONESDT.CNSRQDT) FROM REQUISICIONES
           INNER JOIN REQUISICIONESDT ON
          REQUISICIONESDT.CEDULA = REQUISICIONES.CEDULA AND REQUISICIONES.FECHA_SOLICITUD = REQUISICIONESDT.FECHA_SOLICITUD
           WHERE REQUISICIONES.CNSRQDT IS NULL AND REQUISICIONES.IDRQDT IS NULL)

          SET @IDCNSRQDT=(SELECT MIN (REQUISICIONESDT.ID)FROM REQUISICIONES
           INNER JOIN REQUISICIONESDT ON
         REQUISICIONESDT.CEDULA = REQUISICIONES.CEDULA AND REQUISICIONES.FECHA_SOLICITUD = REQUISICIONESDT.FECHA_SOLICITUD  
         WHERE REQUISICIONES.CNSRQDT IS NULL AND REQUISICIONES.IDRQDT IS NULL)

           UPDATE REQUISICIONES SET REQUISICIONES.CNSRQDT = @FINALCNSRQDT, REQUISICIONES.IDRQDT=@IDCNSRQDT FROM REQUISICIONES
            INNER JOIN REQUISICIONESDT ON
             REQUISICIONESDT.CEDULA = REQUISICIONES.CEDULA AND REQUISICIONES.FECHA_SOLICITUD = REQUISICIONESDT.FECHA_SOLICITUD
            WHERE REQUISICIONESDT.CNSRQDT = @FINALCNSRQDT AND REQUISICIONESDT.ID = @IDCNSRQDT 


ROLLBACK TRANSACTION

-2

এটি নীচে প্রদর্শিত এই কোয়েরির মতোই সহজ।

UPDATE 
  Table1 T1 join Table2 T2 on T1.id = T2.id
SET 
  T1.LastName='DR. XXXXXX', 
  T2.WAprrs='start,stop'
WHERE 
  T1.id = '010008'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.