ऐसी कई स्थितियाँ हैं जहाँ आप नहीं बच सकते हैं 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
OUTER APPLY
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
2. जब हमें 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या unpivoting, जो विनिमेय हैं, जब मान 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