SELECT ROW_NUMBER () উত্পাদিত সারি সংখ্যা অনুসারে বাছাই করা ফলাফল ফেরতের নিশ্চয়তা দিচ্ছে কি?


10

যেমন এসকিউএল কোয়েরি বিবেচনা করুন:

SELECT
   A.[Name],
   ROW_NUMBER() OVER(ORDER BY A.[Name] ASC)
FROM
   [FooTable] AS A

এ। আমি [নাম] দ্বারা সাজানো ফলাফলগুলি পর্যবেক্ষণ করছি। যদি আমি ROW_NUMBER ফাংশনে সংজ্ঞায়িত কলামটি অন্য কলামে পরিবর্তন করি তবে ফলাফলগুলি আবার সেই কলাম অনুসারে বাছাই হয়ে যায়।

আমি প্রত্যাশা করছিলাম যে সারিটি সারিগুলিতে নির্ধারিত হবে তবে আমি একই মানদণ্ড অনুসারে সারিগুলি সাজানো ফিরে আসার প্রত্যাশা করছিলাম না। কীভাবে কীভাবে ক্যোয়ারি কার্যকর করা হচ্ছে তার একটি পার্শ্ব প্রতিক্রিয়া (এসকিউএল সার্ভার ২০০৮ আর 2 তে আমার ক্ষেত্রে) বা এই আচরণের নিশ্চয়তা রয়েছে? (আমি এই ধরনের গ্যারান্টিটির কোনও রেফারেন্স পাইনি)।


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

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

1
তাহলে কেন এই প্রশ্ন জিজ্ঞাসা করবেন না?
অ্যারন বারট্র্যান্ড

উত্তর:


14

আপনি যদি প্রশ্নটি জিজ্ঞাসা করে থাকেন তবে আমার মনে হয় আপনি আসলে জিজ্ঞাসা করতে চেয়েছিলেন:

ROW_NUMBER()জটিল ORDER BYএক্সপ্রেশনটি না বলে আমি কীভাবে অর্ডার করতে পারি ?

আমরা আপনাকে ROW_NUMBER()অভিব্যক্তিটির জন্য একটি উপনাম তৈরি করতে এবং তারপরে উপন্যাসটি ব্যবহার করে বাছাই করতে পারি:

SELECT
   A.[Name],
   rn = ROW_NUMBER() OVER (ORDER BY <complex expression>)
FROM
   dbo.[FooTable] AS A
ORDER BY rn;

এখন আপনাকে কেবলমাত্র এক জায়গায় অভিব্যক্তিটি পরিবর্তন করতে হবে, এবং ফলস্বরূপ সাজানো পুনরায় না করেই সেই অভিব্যক্তির ভিত্তিতে তৈরি হবে on


6
আসলে, repeating the complex ORDER BY expressionএমনকি গ্যারান্টিও দেয় না আউটপুট ROW_NUMBER () অর্ডার দ্বারা প্রকাশিত হবে। যদি না আদেশের কলামের কলামগুলিতে একটি অনন্য কী তৈরি না হয়।
孔夫子

22

একেবারে না. প্রমাণ:

SELECT
   A.[Name],
   ROW_NUMBER() OVER(ORDER BY A.[Name] ASC),
   ROW_NUMBER() OVER(ORDER BY A.[Name] DESC)
FROM
   [FooTable] AS A

এসকিউএল-এ কোনও আদেশের গ্যারান্টি দেওয়ার একমাত্র উপায় এটির জন্য অনুরোধ ORDER BYকরা, ফলাফলটি নিজেই ব্যবহার করা।


ঠিক আছে আমি আরও একটি যোগ্যতা যুক্ত করব - ফলাফলগুলি বাছাইয়ের গ্যারান্টিযুক্ত যদি কেবলমাত্র একটি ROW_NUMBER () শর্ত নির্দিষ্ট করা থাকে।
redcalx

22
এসকিউএল-এ কোনও আদেশের গ্যারান্টি দেওয়ার একমাত্র উপায় এটির জন্য জিজ্ঞাসা করা
রিমাস রুসানু

0

প্রকৃতপক্ষে (পুরানো) প্রশ্নটি বিভাজনকেও অংশ হিসাবে অন্তর্ভুক্ত করা যেতে পারে , কারণ মনে হয় প্রথমে বিভাজন দ্বারা একটি বিভক্ত আদেশ রয়েছে এবং তারপরে অংশ (অংশ) দ্বারা আদেশ

সুতরাং এটি এতটা সহজ নয় যে কেউ কেউ সারি_সংখ্যার বরাদ্দ করতে এবং অর্ডার করার জন্য এটি ব্যবহার করার পরামর্শ দিয়েছেন।

আমাদেরও একটি নেস্টেড এসকিএল প্রয়োজন হবে পাশাপাশি ধারা দ্বারা পার্টিশনটি বের করা (যদি আমরা কেবল অবশ্যই এটির পুনরাবৃত্তি করতে না চাই)

উত্সর্গীয়ভাবে আমরা স্পষ্টত অর্ডার দেওয়ার শেষ লাইনটি পেয়েছি বলে মনে হয়

Select
  <field-list>, 
  rn=Row_Number() over(partition by <PartionClause>) order by <OrderClause>
from ....
Order by <PartionClause> asc, rn asc

তবে আমাদের যে অভাব রয়েছে তার কোনও প্রমাণ বা গ্যারান্টি যা এটি সর্বদা ধারণ করে।

(যদি প্লেতে একাধিক রো_ নাম্বার () কল থাকে তবে এটি অর্ডারটি মনে হচ্ছে এমনটি সর্বশেষতম)

এছাড়াও দ্রষ্টব্য , আপনি কার্যকরভাবে পরিকল্পনার মাধ্যমে আদেশটি স্পষ্টভাবে যুক্ত করলে চূড়ান্তভাবে একটি চূড়ান্ত ধরণের ধাপটি দেখায় এবং ইতিমধ্যে সাজানো সেটকে বাছাই করা একদম নিকৃষ্ট ঘটনা, সুতরাং এটি বিনা চেয়ে অর্ডারটির সাথে যথেষ্ট সময় নেয়


1
এটি সত্যই প্রশ্নের উত্তর দেয় না এবং এটি গ্রহণযোগ্য উত্তর এবং একটি উচ্চ উত্তরের উত্তর উভয়ের সাথে একমত নয় বলে মনে হয়।
এরিক ডার্লিং

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

(অবশ্যই এটি কেবল প্রকারভেদ করে যদি কোনও উপযুক্ত সূচক না থাকে যা এটি টেবিলটি অ্যাক্সেস করতে ব্যবহার করতে পারে তবে এটি কেবল এটি যুক্ত করে যুক্ত করে দেয় যে এটি স্পষ্টভাবে আদেশ দিয়ে দেওয়া ব্যয়-মুক্ত নয়)
এস্কে রাহনে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.