[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.표준 SQL에 따르면,이 쉼표보다 우선 순위를 키워드가 가입하기 때문에 오류가 발생합니다. 끈적 끈적한 점은 테이블 별칭은 해당 테이블이 FROM 절에서 평가 한 후 때까지 사용할 수없는 점이다.
표준 SQL에 따르면,이 쉼표보다 우선 순위를 키워드가 가입하기 때문에 오류가 발생합니다. 끈적 끈적한 점은 테이블 별칭은 해당 테이블이 FROM 절에서 평가 한 후 때까지 사용할 수없는 점이다.
당신이 E1을 참조 할 때 따라서 당신의 가입 ... 발현에 아직 E1 존재하지 않습니다.
내가 최대 절전 모드를 연구하면서 대기하고 모든 경우에 가입 사용하도록 설득 할 수 있는지 확인하십시오.
흠. Hibernate.org에서 모든 jboss.org로 리디렉션 것으로 보인다. 결코 그래서 지금 온라인 HQL 문서를 읽을 수 있습니다. 나는 그들이 궁극적 인 자신의 이름을 알아낼 수 있습니다 확신합니다.
-
==============================
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.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"같은 뭔가?
from https://stackoverflow.com/questions/761545/mixing-implicit-and-explicit-joins by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 에 .dtsx 파일에서 자동화 버전 번호 검색 (0) | 2020.05.05 |
---|---|
[SQL] C #을 구성하는 매개 변수 쿼리의 SQL - LIKE %의 (0) | 2020.05.05 |
[SQL] 프로 시저 또는 함수! 지정된 인수를 너무 많이 (0) | 2020.05.05 |
[SQL] 나는 오류 "참조 제약 조건과 충돌 DELETE 문"을 가지고 (0) | 2020.05.05 |
[SQL] 아마도 SQL 서버 PIVOT? (0) | 2020.05.05 |