কীভাবে এসকিউএল একটি সাব কোয়েরি ব্যবহার করে মুছতে পারে


15

সারণী থেকে নকল রেকর্ড মুছতে আমাদের কোড বিকাশকারীদের দ্বারা নিম্নলিখিত কোডটি যুক্ত করা হয়েছিল:

DELETE  SubQuery

FROM
(
    SELECT  ID
            ,FK1
            ,FK2
            ,CreatedDateTime
            ,ROW_NUMBER() OVER(PARTITION BY FK1, FK2 ORDER BY CreatedDateTime) AS RowNumber

    FROM    Table
)
AS SubQuery

WHERE   RowNumber > 1

কোডটি পর্যালোচনা করার সময়, আমি ধরে নিয়েছিলাম যে এটি কাজ করবে না, তবে এটি আমাদের পরীক্ষার পরিবেশে (এসকিউএল 2014) পরীক্ষা করে দেখায় যে এটি কার্যকর করে!

এসকিউএল কীভাবে সাব কোয়েরি সমাধান করতে এবং এর থেকে রেকর্ডগুলি মুছতে tableজানে?

উত্তর:


14

subqueryআপনার কোড আপনি আছেন একটি বলা হয় উদ্ভূত টেবিল । এটি কোনও বেস টেবিল নয়, এমন একটি টেবিল যা ক্যোরি চালানোর সময় "বেঁচে থাকে"। ভালো লেগেছে মতামত (এটিও বলা হয় দেখা টেবিল ) - এবং সাম্প্রতিক সংস্করণে CTEs যা অন্য, 4 র্থ উপায় একটি ক্যোয়ারী ভিতরে একটি টেবিল "define" - তারা নানাভাবে একটি টেবিল একই রকম। আপনি করতে পারেন selectতাদের কাছ থেকে, আপনি তাদের ব্যবহার করতে পারেন fromবা joinতাদের অন্যান্য সারণীগুলিতে (বেস বা না!)।

কিছু ডিবিএমএসে, (সমস্ত ডিবিএমএস একইভাবে প্রয়োগ করে না) এই সারণী / দর্শনগুলি আপডেটযোগ্য । এবং "updatable" আমরা এটিও করতে পারেন তার মানে update, insertবা deleteতাদের কাছ থেকে।

যদিও সীমাবদ্ধতা রয়েছে এবং এটি প্রত্যাশিত। subquery2 (বা 17 টেবিল) এর যোগদান ছিল কিনা তা কল্পনা করুন । তার deleteমানে কি তখন? (কোন সারণী থেকে সারিগুলি সরিয়ে ফেলা উচিত?) আপডেটযোগ্য দর্শনগুলি একটি খুব জটিল বিষয় । রিলেশনাল তত্ত্বের সুপরিচিত বিশেষজ্ঞ, ক্রিস ডেটের লেখা এই বিষয়ে পুরোপুরি একটি সাম্প্রতিক (২০১২) বই রয়েছে: দেখুন আপডেটিং এবং রিলেশনাল থিয়োরি

যখন উত্পন্ন টেবিলটি (বা দেখুন) খুব সাধারণ ক্যোয়ারী হয়, যেমন এটির কেবল একটি বেস টেবিল থাকে (সম্ভবত এটি দ্বারা সীমাবদ্ধ WHERE) এবং না GROUP BY, তখন উত্পন্ন টেবিলের প্রতিটি সারি অন্তর্নিহিত বেস টেবিলের একটি সারিটির সাথে মিলে যায়, তাই এটি হয় এটি থেকে আপডেট, সন্নিবেশ বা মুছতে সহজ *

সাবকিউয়ের ভিতরে কোডটি আরও জটিল হলে, উত্পন্ন টেবিল / দৃশ্যের সারিগুলি অন্তর্নিহিত বেস টেবিলগুলির মধ্যে একটি থেকে সারিগুলিতে সনাক্ত করা / সমাধান করা যায় কিনা তার উপর নির্ভর করে।

SQL সার্ভার জন্য, আপনি দুটিই MSDN মধ্যে Updatable দেখেছে অনুচ্ছেদে আরও পড়তে পারেন: CREATE VIEW

আপডেটযোগ্য দৃশ্যগুলি

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

  • সহ যেকোন পরিবর্তন, UPDATE, INSERT, এবং DELETEবিবৃতি, অবশ্যই রেফারেন্স কলাম শুধুমাত্র একটি বেস টেবিল থেকে।

  • ভিউতে সংশোধিত হওয়া কলামগুলি অবশ্যই টেবিল কলামগুলিতে অন্তর্নিহিত ডেটা সরাসরি উল্লেখ করতে হবে। কলামগুলি অন্য কোনও উপায়ে উত্পন্ন করা যায় না, যেমন নীচের মাধ্যমে:

  • একটি সমষ্টিগত ফাংশন: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR, এবং VARP

  • একটি গণনা। অন্যান্য কলাম ব্যবহার করে এমন একটি এক্সপ্রেশন থেকে কলামটি গণনা করা যায় না। কলাম সেট অপারেটার ব্যবহার করে গঠিত হয় UNION, UNION ALL, CROSSJOIN, EXCEPT, এবং INTERSECT একটি গণনার পরিমাণ এবং updatable নয়।

  • কলাম পরিবর্তিত হচ্ছে দ্বারা প্রভাবিত হয় না GROUP BY, HAVINGঅথবা DISTINCTক্লজ।

  • TOPWITH CHECK OPTIONদফার সাথে ভিউয়ের সিলেক্ট স্টেটমেন্টে কোথাও ব্যবহার করা হয় না ।

পূর্ববর্তী বিধিনিষেধগুলি FROMভিউয়ের দফায় যে কোনও সাবকিউয়েরিতে প্রযোজ্য , ঠিক যেমনটি তারা দৃশ্যে প্রয়োগ হয়। সাধারণত, ডেটাবেস ইঞ্জিনটি অবশ্যই দ্বি সংজ্ঞা থেকে একটি বেস টেবিলের মধ্যে পরিবর্তনগুলি স্পষ্ট করতে সক্ষম হতে হবে।


আসলে deleteসহজ, কম জটিল update। বেস টেবিলের কোন সারিগুলি মুছতে হবে তা সনাক্ত করার জন্য এসকিউএল সার্ভারের কেবল প্রাথমিক কী বা অন্য কোনও উপায় প্রয়োজন। কারণ update, একটি অতিরিক্ত (বরং স্পষ্ট) বিধিনিষেধ রয়েছে যা আমরা কোনও গণিত কলাম আপডেট করতে পারি না। একটি আপডেট করার জন্য আপনি আপনার ক্যোয়ারীটি সংশোধন করার চেষ্টা করতে পারেন। উইন্ডোজ আপডেট করা CreatedDateTimeসম্ভবত ঠিক কাজ করবে তবে গণিত RowNumberকলামটি আপডেট করার চেষ্টা করলে ত্রুটি বাড়বে। এবং insertআরও জটিল, কারণ আমাদের বেস টেবিলের সমস্ত কলামের মান DEFAULTবাধা দিতে হবে না যার সীমাবদ্ধতা নেই।


4

আপনি কোয়েরি প্ল্যানটি দেখলে এটি দেখতে সহজ easy আপনার ক্ষেত্রে, পরিকল্পনায় সারি নম্বরটি পরিচালনা করতে কেবলমাত্র একটি অতিরিক্ত সেগমেন্ট এবং সিকোয়েন্স প্রজেক্ট অপারেটর রয়েছে। এই ধরণের অপারেশনটি কেবল তখনই কাজ করে যখন এসকিউএল সার্ভার আসলে অন্তর্নিহিত টেবিলটি সমাধান করতে পারে।

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

আমার একটি পুরানো ব্লগ পোস্টে আরও ।

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