>데이터 베이스 >MySQL 튜토리얼 >SQL 잘못된 구문에서 암시적 JOIN과 명시적 JOIN을 혼합하는 이유는 무엇입니까?

SQL 잘못된 구문에서 암시적 JOIN과 명시적 JOIN을 혼합하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-14 19:37:47390검색

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

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.