বিভিন্ন পরিস্থিতি রয়েছে যেখানে আপনি এড়াতে পারবেন না CROSS APPLYবা এড়াতে পারবেন না OUTER APPLY।
আপনার দুটি টেবিল রয়েছে তা বিবেচনা করুন।
মাস্টার সারণী
x------x--------------------x
| Id | Name |
x------x--------------------x
| 1 | A |
| 2 | B |
| 3 | C |
x------x--------------------x
বিশদ টেবিল
x------x--------------------x-------x
| Id | PERIOD | QTY |
x------x--------------------x-------x
| 1 | 2014-01-13 | 10 |
| 1 | 2014-01-11 | 15 |
| 1 | 2014-01-12 | 20 |
| 2 | 2014-01-06 | 30 |
| 2 | 2014-01-08 | 40 |
x------x--------------------x-------x
আবেদন করুন
অনেক অবস্থা যেখানে আমরা প্রতিস্থাপন করা প্রয়োজন আছে INNER JOINসঙ্গে CROSS APPLY।
1. যদি আমরা কার্যকারিতা TOP nসহ ফলাফলগুলিতে 2 টেবিলগুলিতে যোগদান করতে চাইINNER JOIN
যদি আমরা নির্বাচন করতে হবে বিবেচনা করুন Idএবং Nameথেকে Masterপ্রত্যেকের জন্য এবং শেষ দুটি তারিখের Idথেকে Details table।
SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
INNER JOIN
(
SELECT TOP 2 ID, PERIOD,QTY
FROM DETAILS D
ORDER BY CAST(PERIOD AS DATE)DESC
)D
ON M.ID=D.ID
উপরের প্রশ্নটি নিম্নলিখিত ফলাফল উত্পন্ন করে।
x------x---------x--------------x-------x
| Id | Name | PERIOD | QTY |
x------x---------x--------------x-------x
| 1 | A | 2014-01-13 | 10 |
| 1 | A | 2014-01-12 | 20 |
x------x---------x--------------x-------x
দেখুন, এটি শেষ দুটি তারিখের সাথে শেষ দুটি তারিখের ফলাফল তৈরি করেছে Idএবং তারপরে কেবলমাত্র বাইরের ক্যোয়ারিতে এই রেকর্ডগুলিতে যোগদান করেছে Id, যা ভুল। এটি সম্পাদন করার জন্য, আমাদের ব্যবহার করা দরকার CROSS APPLY।
SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
CROSS APPLY
(
SELECT TOP 2 ID, PERIOD,QTY
FROM DETAILS D
WHERE M.ID=D.ID
ORDER BY CAST(PERIOD AS DATE)DESC
)D
এবং ফর্ম তিনি অনুসরণ নিম্নলিখিত।
x------x---------x--------------x-------x
| Id | Name | PERIOD | QTY |
x------x---------x--------------x-------x
| 1 | A | 2014-01-13 | 10 |
| 1 | A | 2014-01-12 | 20 |
| 2 | B | 2014-01-08 | 40 |
| 2 | B | 2014-01-06 | 30 |
x------x---------x--------------x-------x
এখানে কাজ করা হয়। কোয়েরির ভিতরে CROSS APPLYথাকা সন্ধানটি বাইরের সারণিকে উল্লেখ করতে পারে, যেখানে এটি INNER JOINকরতে পারে না (কম্পাইল ত্রুটি নিক্ষেপ করে)। শেষ দুটি তারিখ সন্ধান করার সময়, যোগদান করা ভিতরে করা হয়, CROSS APPLYঅর্থাৎ WHERE M.ID=D.ID।
2. যখন আমাদের INNER JOINফাংশনগুলি ব্যবহার করে কার্যকারিতা প্রয়োজন ।
CROSS APPLYINNER JOINযখন আমাদের Masterটেবিল থেকে ফলাফল পেতে হবে এবং ক এর সাথে প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে function।
SELECT M.ID,M.NAME,C.PERIOD,C.QTY
FROM MASTER M
CROSS APPLY dbo.FnGetQty(M.ID) C
এবং এখানে ফাংশন
CREATE FUNCTION FnGetQty
(
@Id INT
)
RETURNS TABLE
AS
RETURN
(
SELECT ID,PERIOD,QTY
FROM DETAILS
WHERE ID=@Id
)
যা নিম্নলিখিত ফলাফল উত্পন্ন
x------x---------x--------------x-------x
| Id | Name | PERIOD | QTY |
x------x---------x--------------x-------x
| 1 | A | 2014-01-13 | 10 |
| 1 | A | 2014-01-11 | 15 |
| 1 | A | 2014-01-12 | 20 |
| 2 | B | 2014-01-06 | 30 |
| 2 | B | 2014-01-08 | 40 |
x------x---------x--------------x-------x
আউট আবেদন করুন
1. যদি আমরা কার্যকারিতা TOP nসহ ফলাফলগুলিতে 2 টেবিলগুলিতে যোগদান করতে চাইLEFT JOIN
আমাদের যদি টেবিল Masterথেকে প্রতিটি আইডির জন্য আইডি এবং নাম এবং শেষ দুটি তারিখ নির্বাচন করতে হয় তা বিবেচনা করুন Details।
SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
LEFT JOIN
(
SELECT TOP 2 ID, PERIOD,QTY
FROM DETAILS D
ORDER BY CAST(PERIOD AS DATE)DESC
)D
ON M.ID=D.ID
যা নিম্নলিখিত ফলাফল গঠন করে
x------x---------x--------------x-------x
| Id | Name | PERIOD | QTY |
x------x---------x--------------x-------x
| 1 | A | 2014-01-13 | 10 |
| 1 | A | 2014-01-12 | 20 |
| 2 | B | NULL | NULL |
| 3 | C | NULL | NULL |
x------x---------x--------------x-------x
এটি ভুল ফলাফল আনবে অর্থাত্, এটি আমাদের সাথে যোগদান করেও Detailsনির্বিশেষে টেবিল থেকে কেবল সর্বশেষ দুটি তারিখের ডেটা নিয়ে আসবে । সুতরাং সঠিক সমাধান ব্যবহার করা হয় ।IdIdOUTER APPLY
SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
OUTER APPLY
(
SELECT TOP 2 ID, PERIOD,QTY
FROM DETAILS D
WHERE M.ID=D.ID
ORDER BY CAST(PERIOD AS DATE)DESC
)D
যা নিম্নলিখিত পছন্দসই ফলাফল গঠন করে
x------x---------x--------------x-------x
| Id | Name | PERIOD | QTY |
x------x---------x--------------x-------x
| 1 | A | 2014-01-13 | 10 |
| 1 | A | 2014-01-12 | 20 |
| 2 | B | 2014-01-08 | 40 |
| 2 | B | 2014-01-06 | 30 |
| 3 | C | NULL | NULL |
x------x---------x--------------x-------x
২. যখন আমাদের LEFT JOINব্যবহারের কার্যকারিতা প্রয়োজন functions।
OUTER APPLYLEFT JOINযখন আমাদের Masterটেবিল থেকে ফলাফল পেতে হবে এবং ক এর সাথে প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে function।
SELECT M.ID,M.NAME,C.PERIOD,C.QTY
FROM MASTER M
OUTER APPLY dbo.FnGetQty(M.ID) C
এবং ফাংশন এখানে যায়।
CREATE FUNCTION FnGetQty
(
@Id INT
)
RETURNS TABLE
AS
RETURN
(
SELECT ID,PERIOD,QTY
FROM DETAILS
WHERE ID=@Id
)
যা নিম্নলিখিত ফলাফল উত্পন্ন
x------x---------x--------------x-------x
| Id | Name | PERIOD | QTY |
x------x---------x--------------x-------x
| 1 | A | 2014-01-13 | 10 |
| 1 | A | 2014-01-11 | 15 |
| 1 | A | 2014-01-12 | 20 |
| 2 | B | 2014-01-06 | 30 |
| 2 | B | 2014-01-08 | 40 |
| 3 | C | NULL | NULL |
x------x---------x--------------x-------x
সাধারণ বৈশিষ্ট্য CROSS APPLYএবংOUTER APPLY
CROSS APPLYবা আনপিবোটিংয়ের সময় মানগুলি OUTER APPLYধরে রাখতে ব্যবহার করা যেতে পারে NULLযা বিনিময়যোগ্য।
নীচের টেবিলটি বিবেচনা করুন
x------x-------------x--------------x
| Id | FROMDATE | TODATE |
x------x-------------x--------------x
| 1 | 2014-01-11 | 2014-01-13 |
| 1 | 2014-02-23 | 2014-02-27 |
| 2 | 2014-05-06 | 2014-05-30 |
| 3 | NULL | NULL |
x------x-------------x--------------x
আপনি যখন একটি কলামে AND UNPIVOTআনতে ব্যবহার করবেন , এটি ডিফল্টরূপে মানগুলি মুছে ফেলবে ।FROMDATETODATENULL
SELECT ID,DATES
FROM MYTABLE
UNPIVOT (DATES FOR COLS IN (FROMDATE,TODATE)) P
যা নীচের ফলাফল তৈরি করে। নোট করুন যে আমরা Idসংখ্যার রেকর্ড মিস করেছি3
x------x-------------x
| Id | DATES |
x------x-------------x
| 1 | 2014-01-11 |
| 1 | 2014-01-13 |
| 1 | 2014-02-23 |
| 1 | 2014-02-27 |
| 2 | 2014-05-06 |
| 2 | 2014-05-30 |
x------x-------------x
এই ক্ষেত্রে একটি CROSS APPLYবা OUTER APPLYদরকারী হবে
SELECT DISTINCT ID,DATES
FROM MYTABLE
OUTER APPLY(VALUES (FROMDATE),(TODATE))
COLUMNNAMES(DATES)
যা নিম্নলিখিত ফলাফল গঠন করে এবং Idএর মান কোথায় রয়েছে তা ধরে রাখে3
x------x-------------x
| Id | DATES |
x------x-------------x
| 1 | 2014-01-11 |
| 1 | 2014-01-13 |
| 1 | 2014-02-23 |
| 1 | 2014-02-27 |
| 2 | 2014-05-06 |
| 2 | 2014-05-30 |
| 3 | NULL |
x------x-------------x