সারসংক্ষেপ
এটি করা যায়নি এমন কোনও যৌক্তিক কারণ নেই , তবে সুবিধাটি সামান্য এবং এমন কিছু সমস্যা রয়েছে যা অবিলম্বে প্রকাশ নাও হতে পারে।
গবেষণার ফল
আমি কিছু গবেষণা করেছি এবং কিছু ভাল তথ্য পেয়েছি। নিম্নলিখিতটি একটি নির্ভরযোগ্য প্রাথমিক উত্স থেকে সরাসরি উদ্ধৃতি (যা নাম বেনামে থাকতে চায়) 2012-08-09 17:49 GMT:
যখন এসকিউএল প্রথম আবিষ্কার করা হয়েছিল, তখন এর নির্বাচন বিভাগে এটির কোনও উপাধি ছিল না। এটি একটি গুরুতর সমস্যা ছিল যা সংশোধন করা হয়েছিল যখন ভাষাটি এএনএসআই দ্বারা প্রায় 1986 সালে মানক করা হয়েছিল।
ভাষাটি ছিল "অ-প্রক্রিয়াজাতীয়" - অন্য কথায়, কীভাবে ডেটা এটি সন্ধান করতে হবে তা উল্লেখ না করেই আপনি যে ডেটা চান তা বর্ণনা করার জন্য was সুতরাং, যতদূর আমি জানি, কোনও এসকিউএল বাস্তবায়ন প্রক্রিয়া করার আগে পুরো ক্যোয়ারীটি বিশ্লেষণ করতে পারে না তার কোনও কারণ নেই এবং এলিয়াসগুলি যে কোনও জায়গায় সংজ্ঞায়িত করা এবং সর্বত্র ব্যবহৃত হতে পারে। উদাহরণস্বরূপ, নিম্নলিখিত কোয়েরিটি বৈধ না হওয়ার কোনও কারণ আমি দেখছি না:
select name, salary + bonus as pay
from employee
where pay > 100000
যদিও আমি মনে করি এটি একটি যুক্তিসঙ্গত ক্যোয়ারী, কিছু এসকিউএল-ভিত্তিক সিস্টেম কিছু বাস্তবায়ন-সম্পর্কিত কারণে এলিয়াসের ব্যবহারের উপর বিধিনিষেধের প্রবর্তন করতে পারে। এসকিউএল সার্ভার এটি করে শুনে আমি অবাক হই না।
আমি এসকিউএল-86 standard স্ট্যান্ডার্ড সম্পর্কে আরও গবেষণায় আগ্রহী এবং আধুনিক ডিবিএমএস কেন আরেফ পুনরায় ব্যবহার সমর্থন করে না, তবে এখনও এটির সাথে খুব দূরে যাওয়ার সময় পাইনি। শুরু করার জন্য, ডকুমেন্টেশনগুলি কোথায় পাবেন বা কমিটিটি কারা গঠন করেছেন তা কীভাবে সন্ধান করতে হবে তা আমি জানি না। কেউ সাহায্য করতে পারেন? এসকিউএল সার্ভার যে মূল সাইব্যাস পণ্যটি এসেছে তা সম্পর্কেও আমি আরও জানতে চাই।
এই গবেষণা এবং আরও কিছু ধারণা থেকে, আমি সন্দেহ করতে পেরেছি যে অন্যান্য অনুচ্ছেদে অন্যান্য উপকরণ ব্যবহার করা, যদিও সম্ভব হয়েছিল, অন্যান্য ভাষার বৈশিষ্ট্যের তুলনায় ডিবিএমএস নির্মাতাদের পক্ষে এত বেশি অগ্রাধিকার কখনও হয়নি। যেহেতু এটি খুব একটা বাধা নয়, ক্যোয়ার লেখক সহজেই কাজ করেছিলেন, অন্যান্য অগ্রগতিতে এর মধ্যে প্রচেষ্টা চালিয়ে যাওয়া অনুকূল নয়। অতিরিক্তভাবে, এটি মালিকানাধীন হবে কারণ এটি স্পষ্টতই এসকিউএল স্ট্যান্ডার্ডের অংশ নয় (যদিও আমি নিশ্চিত হয়ে সে বিষয়ে আরও অনুসন্ধানের অপেক্ষায় আছি) এবং সুতরাং এটি একটি সামান্য উন্নতি হবে, যা ডিবিএমএসের মধ্যে এসকিউএল সামঞ্জস্যতা ভঙ্গ করে। তুলনা করে, CROSS APPLY
(যা সত্যই বাইরের রেফারেন্সকে অনুমতি দেওয়া কোনও উত্সযুক্ত টেবিলের চেয়ে বেশি কিছুই নয়) একটি বিশাল পরিবর্তন, যা মালিকানাধীন যখন অবিশ্বাস্য এক্সপ্রেশনাল পাওয়ারটি সহজেই অন্যভাবে সঞ্চালিত হয় না।
সর্বত্র এলিয়াস ব্যবহারে সমস্যা
আপনি যদি নির্বাচিত আইটেমগুলিকে WHERE ধারাতে রাখার অনুমতি দেন তবে আপনি কেবল অনুসন্ধানের জটিলতাটিই বিস্ফোরিত করতে পারবেন না (এবং এইভাবে একটি ভাল কার্যকর প্রয়োগের সন্ধানের জটিলতা) সম্পূর্ণ অযৌক্তিক স্টাফ নিয়ে আসা সম্ভব। চেষ্টা করুন:
SELECT X + 5 Y FROM MyTable WHERE Y = X
যদি MyTable এর মধ্যে ইতিমধ্যে একটি কলাম Y রয়েছে, তবে কোনটি যেখানে ক্লজটি উল্লেখ করেছে? সমাধানটি হ'ল সিটিই বা একটি উত্পন্ন টেবিল ব্যবহার করা, যা বেশিরভাগ ক্ষেত্রে অতিরিক্ত ব্যয় করা উচিত নয় তবে একই চূড়ান্ত শেষ ফলাফলটি অর্জন করে। সিটিই এবং উত্পন্ন সারণীগুলি একবারে কোনও নামমাত্র একবার ব্যবহার করার অনুমতি দিয়ে কমপক্ষে অস্পষ্টতার সমাধান কার্যকর করে।
এছাড়াও, এফআরওএম ক্লজে এলিয়াস ব্যবহার না করা বিশিষ্ট ধারণা তৈরি করে। আপনি এটি করতে পারবেন না:
SELECT
T3.ID + (SELECT Min(Interval) FROM Intervals WHERE IntName = 'T') CalcID
FROM
Table1 T
INNER JOIN Table2 T2
ON T2.ID = CalcID
INNER JOIN Table3 T3
ON T2.ID = T3.ID
এটা একটা বৃত্তাকার রেফারেন্স (অর্থে যে T2 গোপনে T3 থেকে একটি মান উল্লেখ করা হয়, আগে যে টেবিল JOIN তালিকায় উপস্থাপন করা হয়েছে), এবং এর অভিশাপ হার্ড দেখতে। এটা কেমন:
INSERT dbo.FinalTransaction
SELECT
newid() FinalTransactionGUID,
'GUID is: ' + Convert(varchar(50), FinalTransactionGUID) TextGUID,
T.*
FROM
dbo.MyTable T
আপনি কতটা বাজি রাখতে চান যে newid () ফাংশন দুটি একবার কার্যকর করার পরিকল্পনায় ফেলেছে, পুরোপুরি অপ্রত্যাশিতভাবে দুটি কলামকে পৃথক মান দেখায়? যখন উপরের ক্যোয়ারিটি সিটিই বা উত্পন্ন টেবিলগুলির গভীরে এন স্তরগুলি ব্যবহৃত হয় তখন কী হয়। আমি গ্যারান্টি দিচ্ছি যে সমস্যাটি আপনি কল্পনার চেয়েও খারাপ। আছে ইতিমধ্যে যখন শুধুমাত্র একবার বা একটি ক্যোয়ারী পরিকল্পনা কি সময়ে মূল্যায়ন করা হয় সম্পর্কে গুরুতর অসঙ্গতি সমস্যা, এবং মাইক্রোসফট বলেছে ঠিক হবে নাতাদের মধ্যে কিছু কারণ তারা সঠিকভাবে ক্যোয়ারী বীজগণিত প্রকাশ করছে - যদি কোনও অপ্রত্যাশিত ফলাফল পায়, তবে ক্যোয়ারিকে কিছু অংশে বিভক্ত করুন। সম্ভাব্যভাবে দীর্ঘ দীর্ঘ এই শৃঙ্খলগুলির মাধ্যমে বিজ্ঞপ্তিযুক্ত রেফারেন্সগুলি শিকলযুক্ত রেফারেন্সগুলি সনাক্ত করা – এগুলি বেশ জটিল সমস্যা। সমান্তরালতার পরিচয় দিন এবং আপনি তৈরিতে একটি দুঃস্বপ্ন পেয়েছেন।
দ্রষ্টব্য: WHERE বা GROUP BY- র মধ্যে উপনামটি ব্যবহার করা newid () বা র্যান্ড () এর মতো ফাংশনগুলির সাথে সমস্যার ক্ষেত্রে কোনও পার্থক্য আনছে না।
পুনরায় ব্যবহারযোগ্য এক্সপ্রেশন তৈরি করার একটি এসকিউএল সার্ভার উপায় way
ক্রস অ্যাপ্লাই / আউটর এপ্লিকেশন এসকিউএল সার্ভারের এমন একটি উপায় যা এক্সপ্রেশন তৈরি করতে পারে যা কোয়েরিতে অন্য কোথাও ব্যবহার করা যেতে পারে (কেবলমাত্র এফ্রোম ক্লজের আগে নয়):
SELECT
X.CalcID
FROM
Table1 T
INNER JOIN Table3 T3
ON T.ID = T3.ID
CROSS APPLY (
SELECT
T3.ID + (SELECT Min(Interval) FROM Intervals WHERE IntName = 'T') CalcID
) X
INNER JOIN Table2 T2
ON T2.ID = X.CalcID
এটি দুটি কাজ করে:
- ক্রস অ্যাপ্লিকেশনটিতে সমস্ত অভিব্যক্তি তৈরি করে একটি "নেমস্পেস" (একটি টেবিল ওরফে, এখানে, এক্স) পান এবং সেই নামের জায়গার মধ্যে অনন্য হয়ে উঠুন।
- এটি কোথাও এটিকে স্পষ্ট করে তোলে যে কেবল ক্যালসিডিডি এক্স থেকে আসছে না, তবে এটি স্পষ্ট করে তোলে যে আপনি টেবিলে টি 1 এবং টি 3 তে যোগদান করার সময় কেন এক্স থেকে কিছু ব্যবহার করতে পারবেন না, কারণ এক্স এখনও পরিচয় করা হয়নি।
আমি আসলে ক্রস অ্যাপ্লিকেশনটির বেশ অনুরাগী। এটি আমার বিশ্বস্ত বন্ধু হয়ে গেছে এবং আমি এটি সর্বদা ব্যবহার করি। আংশিক UNPIVOT দরকার (যার জন্য নেটিভ সিনট্যাক্স ব্যবহার করে একটি PIVOT / UNPIVOT বা UNPIVOT / PIVOT দরকার হবে)? ক্রস প্রয়োগের কাজ শেষ হয়েছে। একটি গণনার মান দরকার যা বহুবার পুনরায় ব্যবহৃত হবে? সম্পন্ন. কোনও লিঙ্কযুক্ত সার্ভারে কলগুলির জন্য কঠোরভাবে কার্যকর করার আদেশটি প্রয়োগ করা দরকার? গতিতে চিৎকারের উন্নতি সম্পন্ন। কেবলমাত্র এক ধরণের সারিটি 2 টি সারিতে বিভক্ত হওয়া বা অতিরিক্ত শর্তযুক্ত? সম্পন্ন.
সুতরাং খুব কমপক্ষে, ডিবিএমএস এসকিউএল সার্ভার ২০০৫ এবং তারপরে আপনার কাছে অভিযোগের আর কোনও কারণ নেই: ক্রস আবেদন করুন আপনি যেভাবে চান সেভাবেই আপনি কীভাবে ড্রাইভ করেন।