ऐसी कई स्थितियाँ हैं जहाँ आप नहीं बच सकते हैं 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
लाने के लिए उपयोग करते हैं , तो यह डिफ़ॉल्ट रूप से मानों को समाप्त कर देगा ।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