Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

बाहरी आवेदन का उपयोग कहां करें

एक 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. केस संवेदनशील से असंवेदनशील मामले में SQL सर्वर संयोजन को बदलना?

  2. विशेष वर्णों की अनुमति दें SQL Server 2008

  3. SQL सर्वर:कैसे परीक्षण करें कि किसी स्ट्रिंग में केवल अंक वर्ण हैं?

  4. फ़ंक्शन परिणाम द्वारा SQLAlchemy आदेश

  5. क्या मुझे सेवा वस्तु की आवश्यकता है?