एक LEFT JOIN
OUTER APPLY
. से बदला जाना चाहिए निम्नलिखित स्थितियों में।
<मजबूत>1. यदि हम TOP n
. के आधार पर दो तालिकाओं में शामिल होना चाहते हैं परिणाम
विचार करें कि क्या हमें Id
. का चयन करने की आवश्यकता है और Name
Master
. से और प्रत्येक Id
. के लिए अंतिम दो तिथियां 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
यहाँ काम कर रहा है:LEFT JOIN
में , TOP 2
दिनांक MASTER
. से जुड़ जाएंगे केवल व्युत्पन्न तालिका के अंदर क्वेरी निष्पादित करने के बाद D
. OUTER APPLY
में , यह जुड़ने का उपयोग करता है WHERE M.ID=D.ID
OUTER APPLY
के अंदर , ताकि प्रत्येक ID
Master
. में TOP 2
. के साथ जुड़ जाएगा तिथियाँ जो निम्नलिखित परिणाम लाएँगी।
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 [email protected]
)
जिसने निम्नलिखित परिणाम उत्पन्न किया
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
<मजबूत>3. 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
जब आप UNPIVOT
. का उपयोग करते हैं FROMDATE
bring लाने के लिए और 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
ऐसे मामलों में APPLY
इस्तेमाल किया जा सकता है (या तो 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