Oracle USING 절 모범 사례
고지 사항:저는 개발자이지 DBA가 아닙니다.
저는 우연히 발견한 이후로 오라클의 USING 조항의 열렬한 팬이었고 그 이후로 사실 테이블과 차원 테이블을 결합하기 위해 구식 ON 조항 대신 사용해 왔습니다.나에게, 그것은 훨씬 더 간결한 SQL을 만들고 불필요한 중복 열 없이 더 간결한 결과 집합을 만듭니다.
하지만 어제 동료로부터 모든 USING 조항을 ON으로 전환해 달라는 요청을 받았습니다.저는 그에게 확인하고 그의 이유가 무엇인지 물어보겠습니다.그는 나보다 데이터베이스와 훨씬 더 밀접하게 일을 하기 때문에, 나는 그가 몇 가지 좋은 이유가 있다고 생각합니다.
저는 그에게서 답장을 받지 못했습니다(우리는 다른 시간대에서 일합니다). 하지만 "사용" 조항의 사용과 관련된 지침이나 모범 사례가 있는지 궁금합니다.저는 꽤 많이 검색했지만, 결정적인 것을 발견하지 못했습니다.사실, 저는 어디에서도 좋은 토론조차 하지 못했습니다.
누가 이것을 좀 밝혀줄 수 있습니까?아니면 주제에 대한 좋은 토론에 대한 링크를 제공하시겠습니까?
감사해요!
여러분은 이미 그 차이를 알고 있을 것이지만, 설명서를 보면 다음과 같습니다.
ON 조건 사용
ON
조인 조건을 지정하는 절입니다. 검색 할 수 .WHERE
조항.USING (컬럼) 두 테이블 모두에서 이름이 같은 열의 등호인을 지정할 때,
USING column
절은 사용할 열을 나타냅니다.두 테이블의 조인 열 이름이 같은 경우에만 이 절을 사용할 수 있습니다.이 절 내에서 열 이름을 테이블 이름 또는 테이블 별칭으로 한정하지 마십시오.
따라서 다음과 같습니다.
select e.ename, d.dname
from emp e join dept d using (deptno);
select e.ename, d.dname
from emp e join dept d on d.deptno = e.deptno;
이지만, 에서는 사용할 수 없습니다.using
열 않은 및 결합 하고자 하는 (a) 결합 열을 하려는 경우:
select e.ename, d.dname, d.deptno
from emp e join dept d using(deptno);
select e.ename, d.dname, d.deptno
*
ERROR at line 1:
ORA-25154: column part of USING clause cannot have qualifier
수식어는 하고 물론예생수있고할략은선,있고수▁you▁off▁leave▁the,select ..., deptno
해당 테이블을 사용하여 결합되지 않은 동일한 열을 가진 다른 테이블이 없는 경우:
select e.ename, d.dname, deptno
from emp e join dept d using (deptno) join mytab m using (empno);
select e.ename, d.dname, deptno
*
ERROR at line 1:
ORA-00918: column ambiguously defined
이 경우 적격자만 선택할 수 있습니다.m.deptno
좀...) ( ( 이것은다, 것다니입조된작소)...다것니...
내가 볼 수 있는 주된 이유는using
일 뿐입니다.수 일일뿐입다로 합니다. 때때로 사용할 수 없기 때문에 때때로 로 전환합니다.on
그런 상황들이 좀 거슬릴 수도 있으니까요.하지만 이것은 어떤 심오한 기술적 이유보다는 스타일에 관한 것입니다.
아마도 당신의 동료는 단순히 코딩 표준을 부과(또는 제안)하고 있을 것이지만, 그들만이 그것을 알 것입니다.작성한 새 코드 중 검토 중인 코드를 변경하라는 메시지가 표시되는지 아니면 이전 코드를 변경하라는 메시지가 표시되는지도 명확하지 않습니다.후자라면 그들이 선호하는 이유와 상관없이.on
재작업과 재시험에 관련된 비용/노력과는 별개로, 수정된 코드를 재시험하더라도 새로운 문제가 발생할 위험이 있기 때문에 검증된 코드를 수정하는 것에 대한 별도의 정당성을 얻을 필요가 있다고 생각합니다.
하지만 당신의 질문에 대해 몇 가지 생각이 듭니다.먼저 당신은 다음에 대해 설명합니다.on
구문은 '구식'이지만, 저는 그것이 공정하다고 생각하지 않습니다. 둘 다 유효하고 최신입니다(SQL:2011년 기준으로 생각하지만 인용이 필요합니다!).그리고 이것은:
불필요한 중복 열이 없는 보다 간결한 결과 집합을 생성합니다.
내 생각에 당신이 사용하고 있는 것은select *
그렇지 않으면 값 중 하나를 선택하면 됩니다. 단, 한정자에 대해 몇 개의 문자가 추가됩니다.용사를 합니다.select *
일반적으로 임시 쿼리 및 일부 하위 쿼리를 제외한 모든 항목에 대해 잘못된 관행으로 간주됩니다(예: 여기서는).
관련 질문.
주요 차이점은 구문적인 것으로 보입니다. 열은 다음과 같이 병합됩니다.USING
합류하다.
모든 경우 이는 특정 테이블에서 조인된 열의 값에 액세스할 수 없음을 의미하며, 일부 SQL은 다음과 같이 컴파일되지 않습니다.
SQL> WITH t AS (SELECT 1 a, 2 b, 3 c FROM dual),
2 v AS (SELECT 1 a, 2 b, 3 c FROM dual)
3 SELECT t.* FROM t JOIN v USING (a);
SELECT t.* FROM t JOIN v USING (a)
^
ORA-25154: column part of USING clause cannot have qualifier
외부 조인에서는 외부 테이블 값에 액세스할 수 없음을 의미합니다.
SQL> WITH t AS (SELECT 1 a, 2 b, 3 c FROM dual),
2 v AS (SELECT NULL a, 2 b, 3 c FROM dual)
3 SELECT * FROM t LEFT JOIN v USING (a)
4 WHERE v.a IS NULL;
WHERE v.a IS NULL
^
ORA-25154: column part of USING clause cannot have qualifier
즉, 이 안티조인 구문에 해당하는 것이 없습니다.USING
절:
SQL> WITH t AS (SELECT 1 a, 2 b, 3 c FROM dual),
2 v AS (SELECT NULL a, 2 b, 3 c FROM dual)
3 SELECT * FROM t LEFT JOIN v ON v.a = t.a
4 WHERE v.a IS NULL;
A B C A B C
---------- ---------- ---------- - ---------- ----------
1 2 3
이것과는 별개로, 일단 SQL이 유효하게 되면 어떤 차이가 있는지 모르겠습니다.
하지만, 이 구문은 덜 일반적으로 사용되는 것처럼 보이기 때문에, 나는 오직 그것에만 영향을 미치는 특정 버그가 있다고 해도 놀라지 않을 것입니다.USING
절, 특히 ANSI SQL이 도입된 초기 버전의 경우.저는 모스에서 이것을 확인할 수 있는 어떤 것도 찾지 못했습니다. 부분적으로 사용하는 단어가 버그 설명에 어디에나 있기 때문입니다.
이 기능을 사용하지 않는 이유가 버그 때문이라면 입증 책임은 동료에게 있는 것 같습니다. 버그를 참조/문서화해야 버그가 패치되면 금지가 해제됩니다(데이터베이스 업그레이드...).
만약 그 이유가 외관상이거나 코딩 규약의 일부라면, 그것은 확실히 문서화되어야 합니다.
USING을 사용하면 a.id 의 왼쪽 join b에서 a.id ,aval,bval,cval을 선택할 수도 있습니다. c.id 의 왼쪽 join c(b.id = b.id ;
즉, C의 열이 B 표의 행과 일치할 때만 C의 열을 지정합니다.
언급URL : https://stackoverflow.com/questions/16162897/oracle-using-clause-best-practice
'programing' 카테고리의 다른 글
Firebug를 사용하여 Ajax 코드 디버깅 중 (0) | 2023.08.15 |
---|---|
스크립트로 작성한 후 SQL Management Studio에서 테이블이 존재함을 인식하지 못함 (0) | 2023.08.15 |
jspinner를 사용하여 전체 HTML 페이지 로드 쿼리 (0) | 2023.08.15 |
남은 공간을 View로 채우는 레이아웃을 만드는 방법은 무엇입니까? (0) | 2023.08.15 |
JSP/Servlet 및 Ajax를 사용하여 서버에 파일을 업로드하려면 어떻게 해야 합니까? (0) | 2023.08.15 |