এসকিউএল সার্ভারে INNER যোগদান করে আমি কীভাবে একাধিক টেবিলগুলি মুছব


117

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

DELETE t1,t2 
FROM table1 AS t1 
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...

আমি কীভাবে এসকিউএল সার্ভারে একই জিনিস করব?

উত্তর:


119

আপনি এই উদাহরণে "মুছে ফেলা" সিউডো টেবিলটির সুবিধা নিতে পারেন। কিছুটা এইরকম:

begin transaction;

   declare @deletedIds table ( id int );

   delete from t1
   output deleted.id into @deletedIds
   from table1 as t1
    inner join table2 as t2
      on t2.id = t1.id
    inner join table3 as t3
      on t3.id = t2.id;

   delete from t2
   from table2 as t2
    inner join @deletedIds as d
      on d.id = t2.id;

   delete from t3
   from table3 as t3 ...

commit transaction;

অবশ্যই আপনি একটি 'আউটপুট মোছা' করতে পারেন। তৃতীয় টেবিলে যোগ দিতে যদি আপনার কিছু প্রয়োজন হয় তবে দ্বিতীয়টিও মুছুন।

পার্শ্ব নোট হিসাবে, আপনি sertedোকানোও করতে পারেন * * একটি sertোকানো বিবৃতিতে, এবং উভয় sertedোকানো। * এবং মুছে ফেলা হয়েছে * * একটি আপডেট বিবৃতিতে।

সম্পাদনা: এছাড়াও, আপনি টেবিল 2 + ​​3 থেকে মুছতে টেবিল 1 এ একটি ট্রিগার যোগ করার বিষয়টি বিবেচনা করেছেন? আপনি একটি অন্তর্নিহিত লেনদেনের ভিতরে থাকবেন এবং এতে "সন্নিবেশিত " এবং "মোছা " থাকবে সিউডো-টেবিলগুলিও।


2
কেবলমাত্র টেবিল 1 যেখানে আইডি = এক্স থেকে মুছে ফেলা ভাল এবং তারপরে অভ্যন্তরীণ যোগদান ব্যবহার না করে এবং এই সমস্ত অতিরিক্ত পাঠ্যটি না দিয়ে পরবর্তী টেবিল থেকে মুছে ফেলা ভাল ?? মূলত, অভ্যন্তরীণ জোড় এড়িয়ে যাওয়া আমার কেবলমাত্র 2 টি সহজ প্রশ্ন প্রয়োজন .... বা এই পদ্ধতিটি কি আরও দক্ষ?
কল্যান্ডাস

আমি মনে করি এটি আপনার যেখানে ক্লজটি কতটা জটিল তা নির্ভর করে। জটিলটির জন্য, এটি আরও ভাল হবে কারণ এটি কেবল একবার হয়। তবে এমন একটি সরল ক্ষেত্রে যেখানে ধারাটি প্রচুর সারিগুলিকে প্রভাবিত করে, আপনার প্রস্তাবটি সম্ভবত আরও কার্যকর হবে কারণ এটি টেবিলের পরিবর্তনশীলটিতে অনেকগুলি আইডিকে ধরে রাখতে হবে না।
জন গিব

@ জনগিব, এই উত্তরটি কীভাবে কাজ করে? আপনি কি এই উত্তরটি ব্যাখ্যা করতে পারেন যাতে কোনও মাইএসকিউএল ডেভ বুঝতে পারে?
পেসারিয়ার 14

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

@ জনগিব, এখন এটি পরিষ্কার। আপনার উত্তরে এটি অন্তর্ভুক্ত করা উচিত।
পেসারিয়ার

15
  1. আপনি সর্বদা টেবিলগুলির সম্পর্কের উপরে ক্যাসকেডিং মুছতে সেট আপ করতে পারেন।

  2. আপনি একটি সঞ্চিত পদ্ধতিতে একাধিক মুছতে সক্ষম করতে পারেন।

  3. কাজের এক ইউনিট নিশ্চিত করতে আপনি লেনদেন ব্যবহার করতে পারেন।


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

ভুল উত্তর, যোগ দিয়ে মুছে ফেলা যায়
rboarman

বিজ্ঞাপন 1.) এটি সত্য নয়, এটি সর্বদা সম্ভব নাও হতে পারে। কিছু পরিস্থিতি রয়েছে যেখানে আপনি ক্যাসকেডিং মুছে ফেলতে পারবেন না, যেমন চক্র বা একাধিক ক্যাসকেড পাথ। (দেখুন stackoverflow.com/a/3548225/108374 উদাহরণস্বরূপ)
টম Pažourek

15

আপনি এসকিউএল সার্ভারে ডিলিট এফআরএম ক্লজে জিন সিনট্যাক্স ব্যবহার করতে পারেন তবে আপনি এখনও প্রথম টেবিল থেকে মুছবেন এবং এটি মালিকানার লেনদেন-এসকিউএল এক্সটেনশন যা সাব-কোয়েরির বিকল্প is

উদাহরণ থেকে এখানে :

 -- Transact-SQL extension
 DELETE 
   FROM Sales.SalesPersonQuotaHistory 
     FROM Sales.SalesPersonQuotaHistory AS spqh INNER JOIN 
          Sales.SalesPerson AS sp ON spqh.BusinessEntityID = sp.BusinessEntityID
    WHERE sp.SalesYTD > 2500000.00;

3
উদাহরণ ডি: বিক্রয় বিক্রয় থেকে বিক্রয়। বিক্রয় বিক্রয় থেকে বিক্রয় বিক্রয়। বিক্রয় বিক্রয় থেকে বিক্রয়.SalesPersonQuotaHistory AS spqh অভ্যন্তরীণ বিক্রয়.SalesPerson হিসাবে sp sph.BusinessEntityID = sp.BusinessEntityID WHERE sp.SalesYY00> 25000000;

11

মাস্টার টেবিল থেকে কিছু রেকর্ড মুছার উদাহরণ এবং দুটি বিশদ টেবিল থেকে সংশ্লিষ্ট রেকর্ডগুলি মুছার জন্য:

BEGIN TRAN

  -- create temporary table for deleted IDs
  CREATE TABLE #DeleteIds (
    Id INT NOT NULL PRIMARY KEY
  )

  -- save IDs of master table records (you want to delete) to temporary table    
  INSERT INTO #DeleteIds(Id)
  SELECT DISTINCT mt.MasterTableId
  FROM MasterTable mt 
  INNER JOIN ... 
  WHERE ...  

  -- delete from first detail table using join syntax
  DELETE d
  FROM DetailTable_1 D
  INNER JOIN #DeleteIds X
    ON D.MasterTableId = X.Id


  -- delete from second detail table using IN clause  
  DELETE FROM DetailTable_2
  WHERE MasterTableId IN (
    SELECT X.Id
    FROM #DeleteIds X
  )


  -- and finally delete from master table
  DELETE d
  FROM MasterTable D
  INNER JOIN #DeleteIds X
    ON D.MasterTableId = X.Id

  -- do not forget to drop the temp table
  DROP TABLE #DeleteIds

COMMIT

1
আপনি ব্যবহার গেল SELECT INTO #DeleteIdsপরিবর্তে CREATE TABLE 'DeleteIdsদ্বারা অনুসরণ INSERT INTO 'DeleteIds...?
কল্টর

9

শুধু ভাবছি .. মাইএসকিউএলে এটি কি সম্ভব? এটি টি 1 এবং টি 2 মুছে ফেলবে? অথবা আমি কেবল প্রশ্নটি ভুল বুঝেছি।

তবে আপনি যদি কেবল একাধিক যোগদানের শর্তাবলী সহ টেবিল 1 মুছতে চান তবে কেবল যে টেবিলটি মুছতে চান তার নাম রাখবেন না

এই:

DELETE t1,t2 
FROM table1 AS t1 
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...

এমএসএসকিউএলে কাজ করার জন্য এই জাতীয় লেখা উচিত:

DELETE table1
FROM table1 
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...

অন্য দুটি সাধারণ আরডিবিএমএস কীভাবে মুছে ফেলা অপারেশন করে তা বিপরীতে:

http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html


সেখানে এসকিউএল সার্ভারের টিপটির জন্য ধন্যবাদ, আমাকে এসকিউএলটিকে সেই লাইনগুলি দিয়ে চালিয়ে যেতে হয়েছিল।
পাউক

7

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


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

3

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


2

এতিম না রেখে রেকর্ড মুছে ফেলার এটি বিকল্প উপায়।

@ ব্যবহারকারীর সারণী ঘোষণা করুন (কীভ্যালু ইন্ট, কিছু স্ট্রিং বার্চার (10))
@ ব্যবহারকারীর মধ্যে .োকান
মান (1, '1 মান')

@ ব্যবহারকারীর মধ্যে .োকান
মান (2, '2 মান')

@ ব্যবহারকারীর মধ্যে .োকান
মান (3, '3 মান')

@ পাসওয়ার্ড সারণী ঘোষণা করুন (কীভ্যালু ইন্ট, বিবরণী বারচার (10))
@ পাসওয়ার্ড .োকান
মান (1, '1 পাসওয়ার্ড')
@ পাসওয়ার্ড .োকান
মান (2, '2 পাসওয়ার্ড')
@ পাসওয়ার্ড .োকান
মান (3, '3 পাসওয়ার্ড')

        - আগে মুছে ফেলা
  @ পাসওয়ার্ড থেকে * একটি অভ্যন্তরীণ যোগ যোগদান করুন @ ব্যবহারকারীর বি নির্বাচন করুন
                on a.keyvalue = b.keyvalue
  @ ব্যবহারকারীর থেকে # মুছে যাওয়া আইডিতে * নির্বাচন করুন যেখানে কীভ্যালু = 1 - এটি আউটপুট উদাহরণের মতো কাজ করে
  কীভ্যালু = 1 যেখানে @ ব্যবহারকারীর মুছুন
  @ পাসওয়ার্ড মুছে ফেলুন যেখানে কীভ্যালু রয়েছে (# ডেলিটেডিড থেকে মূলমূল নির্বাচন করুন)

  - মুছে ফেলার পরে -
  @ পাসওয়ার্ড থেকে * একটি অভ্যন্তরীণ যোগ যোগদান করুন @ ব্যবহারকারীর বি নির্বাচন করুন
                on a.keyvalue = b.keyvalue


2

সব উল্লেখ করা হয়েছে। শুধু পারেন ব্যবহার DELETE ON CASCADEপিতা বা মাতা উপর tableবা থেকে মুছে child-tableযাওয়ার parent


সন্তানের টেবিল থেকে পিতামাতার কাছে মুছে ফেলার অর্থ কী? প্রশ্নযুক্ত বা পূর্বোক্ত উত্তরগুলির মতো কৌশলটিতে যোগদানের অর্থ কী আপনি বোঝাতে চান?
ইমরান ফারুকী

1

অ্যারন যেমন ইতিমধ্যে ইঙ্গিত করেছে, আপনি মুছে ফেলা আচরণটি ক্যাসকেডে সেট করতে পারেন এবং এটি পিতামাতার রেকর্ড মুছে ফেলা হলে বাচ্চাদের রেকর্ড মুছে ফেলবে। আপনি যদি না চান কিছু অন্য যাদু ঘটতে পারে (যার ক্ষেত্রে হারুনের উত্তরটির পয়েন্ট 2, 3 দরকারী হবে), তবে কেন আমি আপনাকে অভ্যন্তরীণ যোগদানের সাথে মুছতে হবে তা দেখছি না।


0

জন গিবের উত্তরটির ভিত্তিতে, এফকে সম্পর্কের সাথে দুটি টেবিলের ডেটার সেট মুছে ফেলার জন্য:

--*** To delete from tblMain which JOINs to (has a FK of) tblReferredTo's PK  
--       i.e.  ON tblMain.Refer_FK = tblReferredTo.ID
--*** !!! If you're CERTAIN that no other rows anywhere also refer to the 
--      specific rows in tblReferredTo !!!
BEGIN TRAN;

    --*** Keep the ID's from tblReferredTo when we DELETE from tblMain
    DECLARE @tblDeletedRefs TABLE ( ID INT );
    --*** DELETE from the referring table first
    DELETE FROM tblMain 
    OUTPUT DELETED.Refer_FK INTO @tblDeletedRefs  -- doesn't matter that this isn't DISTINCT, the following DELETE still works.
    WHERE ..... -- be careful if filtering, what if other rows 
                --   in tblMain (or elsewhere) also point to the tblReferredTo rows?

    --*** Now we can remove the referred to rows, even though tblMain no longer refers to them.
    DELETE tblReferredTo
    FROM   tblReferredTo INNER JOIN @tblDeletedRefs Removed  
            ON tblReferredTo.ID = Removed.ID;

COMMIT TRAN;

-3
DELETE     TABLE1 LIN
FROM TABLE1 LIN
INNER JOIN TABLE2 LCS ON  CONDITION
WHERE CONDITION

এটি দুই বা ততোধিক টেবিল থেকে মুছে ফেলা হবে না P দয়া করে প্রশ্নটি বুঝুন
কামরান শহীদ

-5

$ SQL = "থেকে মুছে দিন basic_tbl, education_tbl, personal_tbl, address_tbl, department_tbl ব্যবহার basic_tbl, education_tbl, personal_tbl, address_tbl, department_tbl কোথায় b_id= e_id= p_id= a_id= d_id= '" $ আইডি।। "'"; $ রুপি = mysqli_query ($ বিরূদ্ধে, $ SQL);


দয়া করে আপনার ফর্ম্যাটিংটি ঠিক করুন এবং আপনার কোড কেন কাজ করে তার একটি সংক্ষিপ্ত বিবরণ সরবরাহ করুন।
ব্রায়ান হার্বস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.