Rumah >pangkalan data >tutorial mysql >Mengapa Mencampurkan Gabungan Tersirat dan Eksplisit dalam Sintaks SQL Tidak Sah?

Mengapa Mencampurkan Gabungan Tersirat dan Eksplisit dalam Sintaks SQL Tidak Sah?

Susan Sarandon
Susan Sarandonasal
2025-01-14 19:37:47390semak imbas

Why is Mixing Implicit and Explicit JOINs in SQL Invalid Syntax?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn