বিভিন্ন পরিস্থিতি রয়েছে যেখানে আপনি এড়াতে পারবেন না 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 APPLY
INNER 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
নির্বিশেষে টেবিল থেকে কেবল সর্বশেষ দুটি তারিখের ডেটা নিয়ে আসবে । সুতরাং সঠিক সমাধান ব্যবহার করা হয় ।Id
Id
OUTER 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 APPLY
LEFT 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
আনতে ব্যবহার করবেন , এটি ডিফল্টরূপে মানগুলি মুছে ফেলবে ।FROMDATE
TODATE
NULL
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