tsql - গঠন - ডাটা টেবিল




টি-এসকিউএল: যোগদান মাধ্যমে মুছে ফেলার জন্য সারি নির্বাচন (8)

দৃশ্যপট:

বলুন আমার দুটি টেবিল আছে, টেবিল এবং টেবিল। টেবিলের প্রাথমিক কী একটি একক কলাম (বিআইডি) এবং টেবিলএতে একটি বিদেশী কী কলাম।

আমার অবস্থানে, আমি টেবিলে সমস্ত সারিগুলি সরিয়ে ফেলতে চাই যা সারণি বিবিতে নির্দিষ্ট সারিগুলির সাথে লিঙ্কযুক্ত: আমি কি যোগদান করে তা করতে পারি? যোগদান থেকে টানা হয় যে সমস্ত সারি মুছে ফেলুন?

DELETE FROM TableA 
FROM
   TableA a
   INNER JOIN TableB b
      ON b.BId = a.BId
      AND [my filter condition]

অথবা আমি এটা করতে বাধ্য করছি:

DELETE FROM TableA
WHERE
   BId IN (SELECT BId FROM TableB WHERE [my filter condition])

কারণ আমি জিজ্ঞাসা করি যে বড় টেবিলগুলির সাথে ডিল করার সময় প্রথম বিকল্পটি আরও বেশি কার্যকর হবে বলে মনে হয়।

ধন্যবাদ!


আপনি এই প্রশ্নটি চালাতে পারেন: -

Delete from TableA 
from 
TableA a, TableB b 
where a.Bid=b.Bid
AND [my filter condition]

আমি এই ব্যবহার করছি

DELETE TableA 
FROM TableA a
INNER JOIN
TableB b on b.Bid = a.Bid
AND [condition]

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

Declare @TableA  Table
(
  aId INT,
  aName VARCHAR(50),
  bId INT
)
Declare @TableB  Table
(
  bId INT,
  bName VARCHAR(50)  
)

Declare @TableC  Table
(
  cId INT,
  cName VARCHAR(50),
  dId INT
)
Declare @TableD  Table
(
  dId INT,
  dName VARCHAR(50)  
)

DECLARE @StartTime DATETIME;
SELECT @startTime = GETDATE();

DECLARE @i INT;

SET @i = 1;

WHILE @i < 1000000
BEGIN
  INSERT INTO @TableB VALUES(@i, 'nameB:' + CONVERT(VARCHAR, @i))
  INSERT INTO @TableA VALUES(@i+5, 'nameA:' + CONVERT(VARCHAR, @i+5), @i)

  SET @i = @i + 1;
END

SELECT @startTime = GETDATE()

DELETE a
--SELECT *
FROM @TableA a
Inner Join @TableB b
ON  a.BId = b.BId
WHERE a.aName LIKE '%5'

SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE())

SET @i = 1;
WHILE @i < 1000000
BEGIN
  INSERT INTO @TableD VALUES(@i, 'nameB:' + CONVERT(VARCHAR, @i))
  INSERT INTO @TableC VALUES(@i+5, 'nameA:' + CONVERT(VARCHAR, @i+5), @i)

  SET @i = @i + 1;
END

SELECT @startTime = GETDATE()

DELETE c
--SELECT *
FROM @TableC c
Inner Join @TableD d
ON  c.DId = d.DId
AND c.cName LIKE '%5'

SELECT Duration    = DATEDIFF(ms,@StartTime,GETDATE())

আপনি এই স্ক্রিপ্ট থেকে ভাল কারণ পেতে বা অন্য দরকারী লিখতে পারে, শেয়ার করুন। ধন্যবাদ এবং এই সাহায্য আশা করি।


উপরে সিনট্যাক্স ইন্টারবেস 2007 এ কাজ করে না। পরিবর্তে, আমাকে এমন কিছু ব্যবহার করতে হয়েছিল:

DELETE FROM TableA a WHERE [filter condition on TableA] 
  AND (a.BId IN (SELECT a.BId FROM TableB b JOIN TableA a 
                 ON a.BId = b.BId 
                 WHERE [filter condition on TableB]))

(দ্রষ্টব্য Interbase aliases জন্য AS কীওয়ার্ড সমর্থন করে না)


একটি অ্যাক্সেস ডাটাবেসের সাথে এটি করার চেষ্টা করা হয়েছিল এবং এটি মুছে ফেলার পরে আমি *

DELETE a.*
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]

এসকিউএলাইটে, কাজ করে এমন একমাত্র জিনিস হচ্ছে beauXjames এর উত্তর অনুরূপ।

মনে হচ্ছে DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE); এই DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE); নিচে আসছে DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE); এবং কিছু অস্থায়ী টেবিল নির্বাচন করে ক্র্যাড করা যায় এবং আপনার দুটি টেবিল যোগ করুন যা আপনি টেবিল 1 এ রেকর্ডগুলি মুছে ফেলতে চান এমন শর্তের ভিত্তিতে এই অস্থায়ী টেবিলে ফিল্টার করতে পারেন।


ধরুন আপনার 2 টি টেবিল আছে, একটি মাস্টার সেট (উদাহরণস্বরূপ কর্মচারী) এবং একটি শিশু সেট (উদাহরণস্বরূপ নির্ভরকারী) সহ এক এবং আপনি নির্ভরশীল টেবিলে ডেটা সমস্ত সারি পরিত্রাণ পেতে চাইছেন যা কী করতে পারে না মাস্টার টেবিলে যেকোন সারি দিয়ে।

delete from Dependents where EmpID in (
select d.EmpID from Employees e 
    right join Dependents d on e.EmpID = d.EmpID
    where e.EmpID is null)

এখানে উল্লেখিত বিন্দুটি হল যে আপনি শুধুমাত্র প্রথম যোগদান থেকে এমপিআইডিগুলির একটি 'অ্যারে' সংগ্রহ করছেন, ডিপেন্ডেন্ট টেবিলে এমপিআইডিগুলির সেট মুছে ফেলার জন্য সেট ব্যবহার করে।


হ্যা, তুমি পারো. উদাহরণ:

DELETE TableA 
FROM TableA AS a
INNER JOIN TableB AS b
ON a.BId = b.BId
WHERE [filter condition]

DELETE TableA
FROM   TableA a
       INNER JOIN TableB b
               ON b.Bid = a.Bid
                  AND [my filter condition] 

কাজ করা উচিত





join