ANSI092 표준에는 꽤 흉악한 구문이 포함되어 있습니다. Natural Join 은 하나이고 USING 절은 다른 것입니다. IMHO, 테이블에 열을 추가해도 코드가 깨져서는 안되지만 NATURAL JOIN은 가장 심각한 방식으로 중단됩니다. 중단하는 "가장 좋은"방법은 컴파일 오류입니다. 예를 들어 당신이 * 곳을 선택하면, 열의 추가 할 수컴파일에 실패했습니다. 실패하는 다음으로 가장 좋은 방법은 런타임 오류입니다. 사용자가 볼 수 있기 때문에 더 나쁘지만 여전히 무언가를 깨뜨렸다는 멋진 경고를 제공합니다. ANSI92를 사용하고 NATURAL 조인을 사용하여 쿼리를 작성하면 컴파일 타임에 중단되지 않고 런타임에 중단되지 않고 쿼리가 갑자기 잘못된 결과를 생성하기 시작합니다. 이러한 유형의 버그는 교활합니다. 보고서가 잘못되고 잠재적으로 재무 공개가 잘못되었습니다.
NATURAL 조인에 익숙하지 않은 사용자를 위해. 두 테이블에있는 모든 열 이름에서 두 테이블을 조인합니다. 4 열 키가 있고 입력하는 데 지쳤을 때 정말 멋집니다. 문제는 Table1에 DESCRIPTION이라는 기존 열이 있고 Table2에 새 열을 추가 할 때 발생합니다. 이름은 모르겠습니다. mmm, DESCRIPTION과 같은 무해한 것입니다. 이제 VARCHAR2에서 두 테이블을 조인합니다. (1000) 필드는 자유 형식입니다.
USING 절은 위에서 설명한 문제 외에도 전체 모호성을 유발할 수 있습니다. 다른 SO 게시물 에서 누군가이 ANSI-92 SQL을 보여주고 그것을 읽는 데 도움을 요청했습니다.
SELECT c.*
FROM companies AS c
JOIN users AS u USING(companyid)
JOIN jobs AS j USING(userid)
JOIN useraccounts AS us USING(userid)
WHERE j.jobid = 123
이것은 완전히 모호합니다. 회사와 사용자 테이블 모두에 UserID 열을 넣었는데 불만이 없습니다. 회사의 UserID 열이 해당 행을 마지막으로 수정 한 사람의 ID이면 어떻게됩니까?
나는 진지합니다. 누구든지 그러한 모호성이 필요한 이유를 설명 할 수 있습니까? 왜 표준에 바로 내장되어 있습니까?
코딩을 통해 거기에 복사 / 붙여 넣기하는 개발자 기반이 많다는 것이 Bill이 맞다고 생각합니다. 사실, 저는 ANSI-92에 관해서는 제가 그런 사람이라는 것을 인정할 수 있습니다. 내가 본 모든 예는 괄호 안에 중첩되는 여러 조인을 보여줍니다. 정직함은 SQL에서 테이블을 선택하기 어렵게 만듭니다. 그러나 SQL92 evangilist는 실제로 조인 순서를 강제 할 것이라고 설명했습니다. JESUS ... 내가 본 모든 Copy Paster는 이제 실제로 조인 순서를 강제하고 있습니다. 작업 시간의 95 %는 최적화 프로그램, 특히 copy / paster 에게 더 잘 남았습니다 .
토 말락이 말했을 때 바로 잡았습니다.
사람들은 새로운 구문으로 전환하지 않습니다.
그것은 나에게 무언가를 주어야하고 나는 상승세를 보지 못한다. 그리고 만약 긍정적 인면이 있다면, 부정적인 것은 무시하기에는 너무 큰 앨버트로스입니다.