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
'programing' 카테고리의 다른 글
프로젝트에서 올바른 GoogleService-Info.plist를 찾을 수 없습니다. (0) | 2023.06.25 |
---|---|
Oracle, PostgreSQL 및 SQL Server에서 타임스탬프를 비교하는 일반적인 방법 (0) | 2023.06.25 |
오라클에서 UTF8을 표시하도록 세션을 변경하려면 어떻게 해야 합니까? (0) | 2023.06.25 |
GitHub에서 Git 커밋 메시지 편집 (0) | 2023.06.25 |
텍스트가 잘리거나 기본 키를 포함한 하나 이상의 문자가 대상 코드 페이지에 일치하지 않습니다. (0) | 2023.06.25 |