집 >데이터 베이스 >MySQL 튜토리얼 >SQL 잘못된 구문에서 암시적 JOIN과 명시적 JOIN을 혼합하는 이유는 무엇입니까?
암시적 JOIN과 명시적 JOIN 혼합
공개 질문이지만 SQL에서 암시적 JOIN과 명시적 JOIN을 혼합하면 잘못된 구문이 생성됩니다. 명시적 JOIN과 암시적 JOIN은 개별적으로 작동할 수 있지만 결합하면 오류가 발생할 수 있습니다.
다음 예제 패턴을 고려하세요.
<code class="language-sql">CREATE TABLE Employee ( employeeID INT, name VARCHAR(255), managerEmployeeID INT )</code>
및 샘플 데이터:
<code class="language-sql">INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary') INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)</code>
다음 명시적 JOIN 쿼리는 예상대로 결과를 검색합니다.
<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>
마찬가지로 이 암시적 JOIN 쿼리도 작동합니다.
<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
그러나 암시적 JOIN과 명시적 JOIN을 혼합하려는 경우:
<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>
MSSQL 2000/2008과 MySQL 모두에서 오류가 발생합니다. MS2000에서 오류는 다음과 같습니다.
<code>列前缀'e1'与查询中使用的表名或别名不匹配。</code>
MySQL의 오류는 다음과 같습니다.
<code>'on'子句中未知列'e1.managerEmployeeID'。</code>
이 구문이 왜 유효하지 않습니까?
SQL 표준에서는 JOIN 키워드가 쉼표보다 우선순위가 높다고 규정하고 있습니다. 그러나 테이블 별칭은 FROM 절에서 해당 테이블을 평가한 후에만 사용할 수 있습니다.
혼합 JOIN 쿼리에서 JOIN...ON 표현식은 e1을 참조하지만 쉼표로 구분된 테이블 목록이 아직 처리되지 않았기 때문에 e1은 아직 평가되지 않았습니다.
추가: Hibernate가 명시적인 JOIN을 사용하도록 강제
안타깝게도 Hibernate의 HQL 문서에 대한 조사에서는 명시적 JOIN 사용을 강제하는 방법에 대한 정보가 전혀 나오지 않았습니다.
위 내용은 SQL 잘못된 구문에서 암시적 JOIN과 명시적 JOIN을 혼합하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!