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

यह एसक्यूएल गलत कैसे हो सकता है? मैं क्या नहीं देख रहा हूँ?

SQL-89 "अल्पविराम-शैली" को मिक्स न करें SQL-92 के साथ सिंटैक्स में शामिल हों JOIN वाक्य - विन्यास। इन दो प्रकार के जॉइन ऑपरेशंस की प्राथमिकता के साथ सूक्ष्म मुद्दे हैं।

आपके मामले में, परिणाम यह है कि यह शामिल होने की स्थिति का मूल्यांकन कर रहा है LEFT JOIN u . से पहले तालिका उपनाम मौजूद है। इसलिए यह नहीं जानता कि u.usr_auto_key है।

आप JOIN . का उपयोग करके इस समस्या को ठीक कर सकते हैं सभी जॉइन के लिए सिंटैक्स:

SELECT 
  `u`.`usr_auto_key` AS `u__usr_auto_key`, 
  `s`.`set_auto_key` AS `s__set_auto_key`, 
  `u2`.`usr_auto_key` AS `u2__usr_auto_key`, 
  `u2`.`set_auto_key` AS `u2__set_auto_key`, 
  `u2`.`value` AS `u2__value` 
FROM `User` `u` JOIN `Setting` `s`
LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key` 
WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)

मुझे u . के बीच कोई जुड़ने की शर्त नहीं दिखी और s आपकी क्वेरी में, इसलिए मुझे लगता है कि आप इसे कार्टेशियन उत्पाद बनाना चाहते हैं?

शामिल होने के लिए दो सिंटैक्स रूपों के बीच बातचीत के बारे में अधिक विवरण के लिए, MySQL 5.0.12 में प्रसंस्करण परिवर्तन में शामिल हों अनुभाग देखें। पेज पर http://dev.mysql.com/doc/ रेफमैन/5.0/hi/join.html

अपनी टिप्पणी दें:जैसा कि मैंने कहा, इसे ऑपरेटर प्राथमिकता के साथ करना है। यदि आपके पास एक SQL क्वेरी है जिसमें FROM A, B JOIN C . है तो यह B JOIN C . का मूल्यांकन करता है इससे पहले कि वह A . पर कोई ध्यान दे -- जिसमें टेबल एलियास असाइन करना शामिल है। तो अगर B JOIN C . के लिए आपकी जॉइन कंडीशन A . के लिए टेबल एलियास का उपयोग करता है आपको एक त्रुटि मिलती है क्योंकि वह उपनाम अभी तक मौजूद नहीं है।

यदि आप इसे उल्टा करते हैं और B, A JOIN C run चलाते हैं फिर जब यह A JOIN C . के लिए शामिल होने की स्थिति का मूल्यांकन करता है A . के लिए उपनाम उपलब्ध है और यह काम करता है (इस मामले में कम से कम)।

लेकिन यह एक नाजुक समाधान है, क्योंकि आपको एक ऐसी क्वेरी की भी आवश्यकता हो सकती है जिसे केवल A को पुन:व्यवस्थित करके ठीक नहीं किया जा सकता है और B . कॉमा के साथ पुराने जॉइन सिंटैक्स का उपयोग करना बंद करना बेहतर है। फिर किसी भी जॉइन एक्सप्रेशन की आपके सभी टेबल एलियासेस तक पहुंच होती है और आपको किसी भी क्वेरी में यह समस्या कभी नहीं होगी।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL पदानुक्रमित डेटा के लिए आसन्नता सूची मॉडल बनाम नेस्टेड सेट मॉडल?

  2. SQL डेटा प्रकारों का परिचय

  3. MySQL - डेटाबेस में मौजूद होने पर टेबल कैसे छोड़ें?

  4. मैं .NET के लिए MySQL कनेक्टर का संदर्भ कैसे जोड़ूं?

  5. MySQL में 640k पंक्तियों को अद्यतन करने का प्रयास क्वेरी के दौरान MySQL सर्वर से कनेक्शन खो जाता है