Rumah >pangkalan data >tutorial mysql >Mengapa Mencampurkan Gabungan Tersirat dan Eksplisit dalam Sintaks SQL Tidak Sah?
Gabungan tersurat dan tersirat JOIN
Walaupun ini adalah soalan terbuka, mencampurkan JOIN tersirat dan eksplisit dalam SQL menyebabkan sintaks tidak sah. Walaupun JOIN tersurat dan tersirat boleh berfungsi secara individu, menggabungkannya boleh membawa kepada ralat.
Pertimbangkan corak contoh berikut:
<code class="language-sql">CREATE TABLE Employee ( employeeID INT, name VARCHAR(255), managerEmployeeID INT )</code>
dan data sampel:
<code class="language-sql">INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary') INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)</code>
Pertanyaan JOIN eksplisit berikut mendapatkan semula hasil seperti yang dijangkakan:
<code class="language-sql">SELECT e1.name, e2.name, e1Manager.name FROM Employee e1 CROSS JOIN Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID</code>
Begitu juga, pertanyaan JOIN tersirat ini juga berfungsi:
<code class="language-sql">SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2, Employee e1Manager WHERE e1.managerEmployeeID = e1Manager.employeeID</code>
SQL tidak sah
Walau bagaimanapun, apabila cuba mencampurkan JOIN tersirat dan eksplisit:
<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>
Ralat akan berlaku dalam kedua-dua MSSQL 2000/2008 dan MySQL. Dalam MS2000 ralatnya ialah:
<code>列前缀'e1'与查询中使用的表名或别名不匹配。</code>
Dalam MySQL, ralatnya ialah:
<code>'on'子句中未知列'e1.managerEmployeeID'。</code>
Mengapa sintaks ini tidak sah?
Piawaian SQL menetapkan bahawa kata kunci JOIN mempunyai keutamaan yang lebih tinggi daripada koma. Walau bagaimanapun, alias jadual hanya boleh digunakan selepas jadual yang sepadan telah dinilai dalam klausa FROM.
Dalam pertanyaan JOIN campuran, ungkapan JOIN...ON merujuk kepada e1, tetapi e1 masih belum dinilai kerana senarai jadual yang dipisahkan koma belum diproses lagi.
Tambahan: Paksa Hibernate untuk menggunakan JOIN eksplisit
Malangnya, penyelidikan saya terhadap dokumentasi HQL Hibernate tidak menemui sebarang maklumat tentang cara memaksa penggunaan JOIN yang jelas.
Atas ialah kandungan terperinci Mengapa Mencampurkan Gabungan Tersirat dan Eksplisit dalam Sintaks SQL Tidak Sah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!