Sebab mencampurkan gabungan tersirat dan eksplisit dalam SQL membawa kepada ralat sintaks
Dalam pengaturcaraan pangkalan data, menggunakan gabungan tersirat dan eksplisit boleh menyebabkan masalah. Artikel ini memberikan pandangan yang mendalam tentang pengecualian sintaks SQL yang disebabkan oleh pencampuran jenis sambungan ini secara salah.
Contoh skema dan data
Pertimbangkan corak ringkas berikut:
<code class="language-sql">CREATE TABLE Employee ( employeeID INT, name VARCHAR(255), managerEmployeeID INT ); INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary'); INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1);</code>
Pertanyaan yang sah
Menggunakan gabungan eksplisit atau implisit masing-masing akan menghasilkan pernyataan SQL yang sah:
<code class="language-sql">-- 显式 JOIN SELECT e1.name, e2.name, e1Manager.name FROM Employee e1 CROSS JOIN Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID; -- 隐式 JOIN SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2, Employee e1Manager WHERE e1.managerEmployeeID = e1Manager.employeeID;</code>
Pertanyaan tidak sah
Walau bagaimanapun, mencampurkan gabungan tersurat dan tersirat menjana ralat dalam SQL Server dan MySQL:
<code class="language-sql">SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID;</code>
Punca punca sintaks tidak sah
Ralat sintaks ini disebabkan oleh kata kunci JOIN yang diutamakan daripada koma dalam SQL. Oleh itu, ungkapan JOIN diproses sebelum rujukan jadual (alias) diselesaikan. Akibatnya, rujukan kepada e1 dalam keadaan JOIN (e1.managerEmployeeID) adalah tidak sah kerana e1 tidak ditakrifkan dalam rujukan jadual dipisahkan koma sebelumnya.
Adakah penyelesaiannya?
Mengenai soalan tambahan, tidak jelas daripada maklumat yang diberikan sama ada mungkin untuk memaksa Hibernate untuk menggunakan sambungan yang jelas sahaja. Kajian lanjut diperlukan untuk meneroka kemungkinan ini.
Atas ialah kandungan terperinci Mengapa Percampuran Gabungan Tersirat dan Eksplisit dalam SQL Menyebabkan Ralat Sintaks?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!