बेहतर होगा कि आप प्रश्न को फिर से लिखें:
SELECT payments.*
FROM customers
JOIN payments
ON payments.id_customer = customers.id
WHERE customers.id_project = 5
हालांकि यह कम संक्षिप्त लगता है और एक अच्छा क्वेरी प्लानर यह देखेगा कि आप क्या कर रहे हैं और अपनी सहसंबद्ध उप-क्वेरी को चलाने की कोशिश कर रहे हैं, क्योंकि इसके बजाय उपरोक्त जॉइन करते हैं, एक खराब क्वेरी प्लानर एक इंडेक्स स्कैन कर सकता है payments.id_customer
(यह मानते हुए कि आपके पास एक प्रासंगिक इंडेक्स है ) (या बदतर, टेबल स्कैनिंग) चीजों को अधिक कुशल तरीके से करने के बजाय। यहां तक कि एक अच्छा क्वेरी प्लानर भी अनुकूलन को देखने में विफल हो सकता है यदि इस क्वेरी की व्यवस्था कुछ और जटिल हो। संबंध को एक उप-क्वेरी के बजाय एक जुड़ाव के रूप में व्यक्त करने से आपके डेटा संरचना को बदलने से अधिक अंतर हो सकता है।
जैसा कि जेफ कहते हैं, किसी भी अपवित्रता को देखभाल के साथ माना जाना चाहिए - यह विशेष रूप से कुछ रिपोर्टिंग उद्देश्यों के लिए आसान प्रदर्शन बूस्ट ला सकता है, लेकिन सहायक व्यापारिक तर्क में बग के कारण असंगति पैदा कर सकता है।
एक साइड नोट के रूप में: स्पष्ट रूप से मुझे आपके व्यवसाय का पता नहीं है इसलिए मुझे कुछ याद आ रहा है, लेकिन आपके टेबल संबंध मुझे अजीब लगते हैं। वे कहते हैं कि आपके पास एक ही ग्राहक के साथ एक से अधिक परियोजना नहीं हो सकती है, जो आमतौर पर मेरे अनुभव में सच नहीं है, कम से कम लंबी अवधि में।
customer project payment
-------- -------- -------
pa_id
pr_id <-- payment
cu_id <-- customer
या अगर कम सामान्यीकृत किया जा रहा है (हालांकि मुझे संदेह है कि आवश्यक होगा):
customer project payment
-------- -------- --------
pa_id
pr_id <-- payment
cu_id <-- customer
`------------- customer
बेशक, अभी भी दो ग्राहकों के साथ एक संयुक्त परियोजना की संभावना को छूट देता है ...