programing

Oracle SQL에서 지정된 열을 모두 선택하는 것이 잘못된 이유는 무엇입니까?

muds 2023. 6. 25. 20:38
반응형

Oracle SQL에서 지정된 열을 모두 선택하는 것이 잘못된 이유는 무엇입니까?

내가 선택한 진술서가 있다고 치자...

select * from animals

그러면 테이블의 모든 열에 대한 쿼리 결과가 제공됩니다.

, 만번표 42째열입니다.animals이라is_parent그리고 나는 그것을 내 결과에 돌려주고 싶어, 바로 다음에.gender좀 더 쉽게 볼 수 있게요.하지만 저는 다른 모든 칼럼도 원합니다.

select is_parent, * from animals

은 니다됩반을 반환합니다.ORA-00936: missing expression.

Sybase에서도 동일한 문장이 잘 작동할 것이며, 테이블 별칭을 다음에 추가해야 한다는 것을 알고 있습니다.animals시키기 위한 (작동기하테위블이한▁to(블▁table테이▁(위한▁get기)select is_parent, a.* from animals ani), 하지만 Oracle이 선택을 해결하기 위해 테이블 별칭이 필요한 이유는 무엇입니까?

사실, 원래 문제를 푸는 것은 쉽습니다.*의 자격을 갖추기만 하면 됩니다.

select is_parent, animals.* from animals;

잘 될 겁니다.테이블 이름의 별칭도 사용할 수 있습니다.

생산 코드에서 이것을 하는 것은 장점이 없습니다.SELECT * 구성을 사용하는 대신 원하는 열의 이름을 명시적으로 지정해야 합니다.

임시 쿼리의 경우 SQL 확장 없이 쿼리 및 결과 집합을 조작할 수 있는 IDE - SQL Developer, Toad, PL/SQL Developer 등을 구입하십시오.

좋은 질문입니다. 저도 종종 이것에 대해 궁금해했지만, 그 다음에는 그것을 그것들 중 하나로 받아들였습니다.

유사한 문제는 다음과 같습니다.

sql>select geometrie.SDO_GTYPE from ngg_basiscomponent

ORA-00904: "GEOMETRIE"."SDO_GTYPE": invalid identifier

여기서 geometrie는 mdsys.sdo_interval 유형의 열입니다.

별칭을 추가하면 작동합니다.

sql>select a.geometrie.SDO_GTYPE from ngg_basiscomponent a;

왜 그런지에 대한 지금까지 많은 좋은 대답들.select *사용해서는 안 되며 모두 완벽하게 맞습니다.그러나 그들 중 누구도 특정 구문이 실패하는 이유에 대한 원래 질문에 답하지 않는다고 생각합니다.

슬프게도, 그 이유는..."왜냐하면 그렇지 않기 때문입니다.

단일 테이블 쿼리와 다중 테이블 쿼리는 관련이 없다고 생각합니다.

이것은 잘 작동합니다.

select *
from
    person p inner join user u on u.person_id = p.person_id

하지만 이것은 실패합니다.

select p.person_id, *
from
    person p inner join user u on u.person_id = p.person_id

작동하는 동안:

select p.person_id, p.*, u.*
from
    person p inner join user u on u.person_id = p.person_id

20년 된 레거시 코드와의 역사적 호환성일 수도 있습니다.

"왜 사!"를 위한 또 다른 것.버킷, 그리고가명으로 그룹화할 없습니까?

별칭의 사용 사례입니다.형식은 다음과 같습니다.

select parent.*, child.col
from parent join child on parent.parent_id = child.parent_id

즉, 조인의 한 테이블에서 모든 열을 선택하고 다른 테이블에서 하나 이상의 열을 선택합니다(선택 사항).

이 열을 사용하여 동일한 열을 두 번 선택할 수 있다는 사실은 부작용일 뿐입니다.같은 칼럼을 두 번 선택하는 것은 실질적인 의미가 없으며 게으름이 진정한 정당화라고 생각하지 않습니다.

Select *실제 환경에서는 이름이 아닌 검색 후 인덱스 번호로 열을 참조할 때만 위험합니다. 더 큰 문제는 결과 집합(네트워크 트래픽, CPU 및 메모리 로드)에 모든 열이 필요하지 않을 때의 비효율성입니다.물론 다른 테이블의 열을 추가하는 경우(이 예제에서와 마찬가지로 이러한 테이블은 시간이 지남에 따라 이름이 일치하는 열을 가질 수 있으므로 위험할 수 있습니다.select *, x이 경우 x 열이 이전에 없었던 테이블에 추가되면 실패합니다.

Oracle이 선택 항목을 해결하기 위해 테이블 별칭이 필요한 이유

Teradata도 동일한 요구사항이 있습니다.둘 다 꽤 오래된 것이기 때문에 (아마 성숙한 이라고 부르는 것이 좋을 것입니다:-) DBMS는 역사적인 이유일 수 있습니다.

제가 늘 하는 설명은: 자격이 없습니다.*모든 항목/모든 열을 의미하며, 모든 항목 이상을 요청하기 때문에 파서/최적화기가 혼동됩니다.

언급URL : https://stackoverflow.com/questions/2315295/why-is-selecting-specified-columns-and-all-wrong-in-oracle-sql

반응형