जब भी मुझे किसी तालिका में किसी पंक्ति के अस्तित्व की जाँच करने की आवश्यकता होती है, तो मैं हमेशा एक शर्त लिखता हूँ:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT * -- This is what I normally write
FROM another_table
WHERE another_table.b = a_table.b
)
कुछ अन्य लोग इसे लिखते हैं:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT 1 --- This nice '1' is what I have seen other people use
FROM another_table
WHERE another_table.b = a_table.b
)
जब NOT EXISTS
इसके बजाय की स्थिति है EXISTS
: कुछ अवसरों में, मैं इसे एक LEFT JOIN
और अतिरिक्त शर्त (कभी-कभी एंटीजन कहलाता है ) के साथ लिख सकता हूं :
SELECT a, b, c
FROM a_table
LEFT JOIN another_table ON another_table.b = a_table.b
WHERE another_table.primary_key IS NULL
मैं इसे टालने की कोशिश करता हूं क्योंकि मुझे लगता है कि अर्थ कम स्पष्ट है, विशेष रूप से तब जब आपका जो है primary_key
वह स्पष्ट नहीं है, या जब आपकी प्राथमिक कुंजी या आपकी सम्मिलित स्थिति मल्टी-कॉलम है (और आप आसानी से किसी एक कॉलम को भूल सकते हैं)। हालांकि, कभी-कभी आप किसी और द्वारा लिखे गए कोड को बनाए रखते हैं ... और यह बस वहां है।
क्या
SELECT 1
इसके बजाय उपयोग करने के लिए कोई अंतर (शैली के अलावा) हैSELECT *
?
क्या कोई कोने का मामला है जहां यह उसी तरह व्यवहार नहीं करता है?हालाँकि मैंने जो लिखा है वह (AFAIK) मानक SQL है: क्या विभिन्न डेटाबेस / पुराने संस्करणों के लिए ऐसा अंतर है?
क्या एंटीजन लिखने में एक्सप्लोसिव पर कोई फायदा है?
क्या समकालीन योजनाकार / आशावादी लोग इसेNOT EXISTS
खंड से अलग मानते हैं ?
EXISTS (SELECT FROM ...)
।