암시적 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!