sql - अजीब / गूढ़ शामिल वाक्यविन्यास




sql-server tsql join syntax (3)

मुझे यह पुराना एसक्यूएल कोड (तालिका नाम बदल दिया गया है) को दोहराने के लिए प्रदान किया गया है, और जोन वाक्यविन्यास कुछ मैंने पहले नहीं देखा है, और यह Google के लिए मुश्किल साबित हो रहा है:

select <stuff>

from A

inner join B
on A.ID = B.A_ID

inner join C  -- eh? No ON?

inner join D
ON C.C_ID = D.C_ID

ON B.C_ID = D.C_ID -- a second ON here? what?

जब मैंने कोड देखा, तो मुझे लगता था कि मुझे टूटा कोड भेजा जाएगा और यह नहीं चलेंगे।

लेकिन यह करता है (SQL सर्वर 2012)

यह क्या करता है? क्या यह लिखने का और अधिक समझदार / मानक तरीका है? यहाँ क्या हो रहा है?


Answers

मैंने इसे एक सहयोगी ने भाग लिया, जिसने इसे सोचा:

select <stuff>

from A

inner join B
on A.ID = B.A_ID

inner join ( C  -- put a bracket here...

inner join D
ON C.C_ID = D.C_ID

) -- and one here

ON B.C_ID = D.C_ID

या इसे थोड़ा अच्छा प्रारूपित करने के लिए:

select <stuff>

from A

inner join B
on A.ID = B.A_ID

inner join ( 
    C
    inner join D
    ON C.C_ID = D.C_ID
)
ON B.C_ID = D.C_ID

मैं इस तरह के "उप-जुड़ने" से परिचित नहीं था (मुझे नहीं पता कि इसे क्या कहा गया है), लेकिन यह बहुत अधिक पठनीय और स्पष्ट है


असामान्य रूप से, यह पूरी तरह से वैध एसएसक्यूएल है। आम तौर पर आप इस दृष्टिकोण को देखते हैं जब आपके पास संबंधित तालिकाओं के एक बाहरी से जुड़ते हैं जो आंतरिक रूप से एक दूसरे से जुड़ जाते हैं यह लिखने का एक बेहतर आईएमएचओ तरीका होगा:

inner join B
   on A.ID = B.A_ID
inner join (C inner join D ON C.C_ID = D.C_ID) 
   ON B.C_ID = D.C_ID 

इससे जोड़ना तर्क स्पष्ट होता है - और यह पाठक को भी मदद करता है। इसके अतिरिक्त, यह पाठक को बताता है कि डेवलपर जानबूझकर ऐसा किया था तो ये खराब कोडन का एक उदाहरण हो। चीजें जो असामान्य हैं टिप्पणी करें बातें समझाओ अपनी शैली और उपयोग को बेहतर बनाने में सहायता के लिए किसी व्यक्ति को समय-समय पर आपके कोड की समीक्षा करें।

और आप इसे खंड में से तालिकाओं के क्रम को दोबारा करके "ठेठ" शैली में लिख सकते हैं - लेकिन मुझे लगता है कि वर्तमान संस्करण वास्तविक तालिका नामों के साथ अधिक तार्किक समझ में आता है।


मुझे निम्नलिखित क्रम में शामिल होने के बारे में सोचना आसान लगता है:

  • क्रॉस जॉइन - दोनों टेबलों का एक कार्टेशियन उत्पाद। सभी शामिल हो जाते हैं
  • अंदरूनी जॉइन - एक फ़िल्टर के साथ एक क्रॉस जॉइन जोड़ा गया।
  • बाहरी जॉइन - गायब तत्वों (या तो बाएं या दाएं तालिका से) के साथ एक इंटर्न जॉइन बाद में जोड़ा गया।

जब तक मैंने यह (अपेक्षाकृत) सरल मॉडल नहीं निकाला, जॉन्स हमेशा एक काला कला का थोड़ा और अधिक था। अब वे सही समझ में आते हैं।

उम्मीद है कि इससे भ्रमित होने से ज्यादा मदद मिलती है।





sql sql-server tsql join syntax