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


494

দৃশ্যপট:

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

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

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

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

ধন্যবাদ!

উত্তর:


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

কাজ করা উচিত


1
আমি জো-ক্লজের পরিবর্তে যোগদানের ক্ষেত্রে এবং [আমার ফিল্টার শর্ত] ব্যবহার করেছি। আমি ভাবতে পারি যে দুজনেই কাজ করবে, তবে যোগদানের ফিল্টার শর্তটি আপনার ফলাফলগুলিকে যোগদান থেকে সীমাবদ্ধ করবে।
TheTXI

10
একটি প্রশ্ন. আমাদের কেন 'মোছার ফল থেকে' মুছে ফেলতে হবে? আমি দেখি এটি কেবল এই ক্ষেত্রে কাজ করে তবে কেন?
লাব্রাকা

66
আমি মনে করি কারণ আপনাকে কোন টেবিল থেকে রেকর্ডগুলি মুছতে হবে তা নির্দেশ করতে হবে। আমি কেবল সিনট্যাক্সের সাথে একটি ক্যোয়ারী চালিয়েছি DELETE TableA, TableB ...এবং এটি উভয় থেকেই প্রাসঙ্গিক রেকর্ডগুলি মুছে ফেলেছে। খুশী হলাম।
অ্যান্ড্রু

1
পোস্টগ্রিজ এসকিউএল সিন্ট্যাক্সে যোগদানের সাথে কাজ করে না তবে কীওয়ার্ডটি "ব্যবহার করে" ব্যবহার করা সম্ভব। DELETE from TableA a using TableB b where b.Bid = a.Bid and [my filter condition]
বার্টোলো-ওত্রিট

8
মাইএসকিউএলে আপনি একটি "অজানা সারণী 'টেবিলএ' মাল্টি মুছে ফেলতে" পেয়ে একটি ত্রুটি পেয়েছিলেন এবং এটি কারণ আপনি টেবিলএ (ক) এর জন্য একটি নাম ঘোষণা করেছেন। ছোট সামঞ্জস্য:DELETE a FROM TableA a INNER JOIN TableB b on b.Bid = a.Bid and [my filter condition]
মাসআম

260

আমি এই সিনট্যাক্স ব্যবহার করব

Delete a 
from TableA a
Inner Join TableB b
on  a.BId = b.BId
WHERE [filter condition]

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

আমি এটিকেও পছন্দ করি কারণ ডিলিটের পরে টেবিলের ওরফে প্লেসমেন্টটি আমার কাছে সবসময় আরও স্বজ্ঞাত বলে মনে হয়েছে যা মুছে ফেলা হচ্ছে তা সম্পর্কে।
জাগড

14
আসলে এটি আমার পক্ষেও পছন্দনীয়। বিশেষত যে ক্ষেত্রে আমাকে একই টেবিলে আসলে যোগ দিতে হবে (যেমন নকল রেকর্ড মোছার জন্য)। সেক্ষেত্রে আমার যে পক্ষ থেকে মুছে ফেলা হচ্ছে তার জন্য আমার একটি উপনাম ব্যবহার করা দরকার এবং এই বাক্য গঠনটি এটিকে পরিষ্কার করে দিয়েছে যে আমি নকলের নামটি মুছে ফেলছি alias
ক্রিস সিমন্স

29

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

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

8
আমি প্রথম উক্ত টেবিলটির নামটি তার উপনাম দ্বারা উল্লেখ করতে পছন্দ করি। সেটি হ'ল "টেবিলএ মোছা" না করে "মুছুন"। আপনি নিজের সাথে টেবিলটিতে যোগদান করার ক্ষেত্রে, আপনি কোন দিকটি মুছতে চান তা এটি পরিষ্কার করে দেয়।
জেরেমি স্টেইন

10

একটি অ্যাক্সেস ডাটাবেস দিয়ে এটি করার চেষ্টা করছিল এবং খুঁজে পেয়েছিলাম ডিলিটের ঠিক পরে আমার একটি। * ব্যবহার করা দরকার ।

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

প্রত্যাখ্যাত বাকি থাকা সম্পাদনার থেকে: "। UniqueRecords সম্পত্তি হ্যাঁ নির্ধারণ করা, অন্যথায় এটা করবে না কাজ (রয়েছে support.microsoft.com/kb/240098 )"
StuperUser

8

এটি মাইএসকিউএল- তে প্রায় একইরকম , তবে আপনাকে "মুছে ফেলুন" শব্দের ঠিক পরে টেবিলের নাম ব্যবহার করতে হবে :

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

2

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

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

(দ্রষ্টব্য আন্তঃবাসের জন্য এএস কীওয়ার্ডটি সমর্থন করে না)


2

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

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

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

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

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


1

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

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)

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


1

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

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


1

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

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


1
DELETE FROM table1
where id IN 
    (SELECT id FROM table2..INNER JOIN..INNER JOIN WHERE etc)

যোগদানের সাথে ডিএমএল ক্যোয়ারির ব্যবহার হ্রাস করুন। উপরের মত সাবকিউরিয়াসহ আপনার সমস্ত ডিএমএল ক্যোয়ারী বেশিরভাগই করতে সক্ষম হওয়া উচিত।

সাধারণভাবে, আপনি যখন 2 বা ততোধিক টেবিলের কলামগুলি দ্বারা SELECT বা GROUP প্রয়োজন হয় তখনই যোগ দেওয়া উচিত। আপনি যদি জনসংখ্যার সংজ্ঞা দিতে শুধুমাত্র একাধিক টেবিল স্পর্শ করেন তবে সাব-কোয়্যার ব্যবহার করুন। অনুসন্ধানগুলি মোছার জন্য, সংযুক্ত subquery ব্যবহার করুন।

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