복붙노트

[SQL] 암시 적 및 명시 적 조인 혼합

SQL

암시 적 및 명시 적 조인 혼합

나는 Hibernate가 잘못된 SQL을 생성에 문제가 있어요. 특히, 혼합 암시 적 및 명시 적 조인 일치. 이것은 오픈 버그 것 같다.

이 유효하지 않은 SQL 왜 그러나, 나는 확실하지 않다. 나는 같은 구문 예외를 생성하는 작은 장난감 예제와 함께 올라와있다.

CREATE TABLE Employee (
    employeeID INT,
    name VARCHAR(255),
    managerEmployeeID INT   
)
INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary')
INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)

이러한 쿼리는 모두 작동합니다. 나는 데카르트 제품이 실현; 그 의도입니다.

노골적인 가입 :

SELECT e1.name,
       e2.name,
       e1Manager.name
  FROM Employee e1
 CROSS JOIN Employee e2
 INNER JOIN Employee e1Manager
    ON e1.managerEmployeeID = e1Manager.employeeID

암시는 가입 :

SELECT e1.name,
       e2.name,
       e1Manager.name
  FROM Employee e1,
       Employee e2,
       Employee e1Manager
 WHERE e1.managerEmployeeID = e1Manager.employeeID

이 쿼리는 MSSQL 2,008분의 2,000 또는 MySQL을 작동하지 않습니다

SELECT e1.name, 
       e2.name, 
       e1Manager.name
  FROM Employee e1,
       Employee e2
 INNER JOIN Employee e1Manager 
    ON e1.managerEmployeeID = e1Manager.employeeID

MS2000, 나는 오류를 얻을 :

MySQL의에서 오류는 다음과 같습니다

해결법

  1. ==============================

    1.표준 SQL에 따르면,이 쉼표보다 우선 순위를 키워드가 가입하기 때문에 오류가 발생합니다. 끈적 끈적한 점은 테이블 별칭은 해당 테이블이 FROM 절에서 평가 한 후 때까지 사용할 수없는 점이다.

    표준 SQL에 따르면,이 쉼표보다 우선 순위를 키워드가 가입하기 때문에 오류가 발생합니다. 끈적 끈적한 점은 테이블 별칭은 해당 테이블이 FROM 절에서 평가 한 후 때까지 사용할 수없는 점이다.

    당신이 E1을 참조 할 때 따라서 당신의 가입 ... 발현에 아직 E1 존재하지 않습니다.

    내가 최대 절전 모드를 연구하면서 대기하고 모든 경우에 가입 사용하도록 설득 할 수 있는지 확인하십시오.

    흠. Hibernate.org에서 모든 jboss.org로 리디렉션 것으로 보인다. 결코 그래서 지금 온라인 HQL 문서를 읽을 수 있습니다. 나는 그들이 궁극적 인 자신의 이름을 알아낼 수 있습니다 확신합니다.

  2. ==============================

    2.그것은 전혀하지 우려의 최대 절전 모드를 않지만, 빌 Karwin의 댓글이 정말 내 눈을 뜨게하기 때문에, 주제 조금 떨어져있을 수 있습니다. 대신 처음 가입 암시 쓰는 먼저 합류 명시 할 필요가있다. 당신이 암시 여러 조인이있는 경우이 구문은 특히 흥미 롭다.

    그것은 전혀하지 우려의 최대 절전 모드를 않지만, 빌 Karwin의 댓글이 정말 내 눈을 뜨게하기 때문에, 주제 조금 떨어져있을 수 있습니다. 대신 처음 가입 암시 쓰는 먼저 합류 명시 할 필요가있다. 당신이 암시 여러 조인이있는 경우이 구문은 특히 흥미 롭다.

    MS SQL에서 다음의 예를 확인하십시오. 모든 연락처는 정의 된 국가 코드를 가지고 있지만, 모든 연락처는 테이블 TBL에서 조회 할 것이다 속성 발을 가지고있다. 직관적 인 솔루션이 작동하지 않습니다 그래서 :

    SELECT * FROM 
    contacts, Tbl
    LEFT OUTER JOIN country ON CtryCod = country.CtryCod 
    WHERE val = Tbl.val
    

    대신 오히려 다음과 같은 구문을 사용할 수 있습니다 :

    SELECT * FROM 
    contacts LEFT OUTER JOIN country ON CtryCod = country.CtryCod, 
    Tbl
    WHERE val = Tbl.val
    
  3. ==============================

    3.PostgreSQL은 너무 오류가 있습니다 :

    PostgreSQL은 너무 오류가 있습니다 :

    ERROR:  invalid reference to FROM-clause entry for table "e1"
    LINE 7:     ON e1.managerEmployeeID = e1Manager.employeeID;
                   ^
    HINT:  There is an entry for table "e1", but it cannot be referenced from this part of the query.
    

    나는 문제가 (이 경우 E2와 e1Manager) 두 테이블 A와 B에 가입 할 때 당신은 단지 "ON"절에 두 테이블을 참조 할 수 있다고 생각합니다. 당신은 E2와 e1Manager이 ON 절에 있지만 (E1)를 참조 할 수 있습니다.

    ","나는 이것이 당신이 "가입"문 체인이있는 경우, 당신은 "ON"절에서 같은 체인의 다른 테이블을 참조 할 수 있도록 확장 생각하지만, 당신은 십자가 할 수 없습니다. 같은 그래서`A가 a.a_id = b.a_id ON B를 가입하는 C ON c.b_id = b.b_id 및 c.a_id = a.a_id "허용에 가입하세요.

    이 SQL을 생성하기 위해 사용하는 HQL은 무엇입니까? "직원 E1, 직원 E2에서 선택 e1.name, e2.name, e1.manager.name"같은 뭔가?

  4. from https://stackoverflow.com/questions/761545/mixing-implicit-and-explicit-joins by cc-by-sa and MIT license