programing

Oracle USING 절 모범 사례

skycolor 2023. 8. 15. 10:57
반응형

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

반응형