ORA-00918: SELECT에 모호하게 정의된 열 *
ORA-00918 가져오기: 열이 모호하게 정의됨: 다음 SQL을 실행합니다.
SELECT *
FROM
(SELECT DISTINCT(coaches.id),
people.*,
users.*,
coaches.*
FROM "COACHES"
INNER JOIN people ON people.id = coaches.person_id
INNER JOIN users ON coaches.person_id = users.person_id
LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id
) WHERE rownum <= 25
제안해 주실 수 있나요?
쿼리의 투영에는 지정된 이름의 인스턴스가 하나만 있을 수 있습니다.WHERE 절에 나타나 있듯이 ID라는 이름의 열을 가진 테이블이 여러 개 있습니다.당신이 선택하기 때문에*프로젝션에는 ID라고 불리는 여러 열이 있습니다.아니면 컴파일러가 ORA-00918을 던지지 않았다면 좋았을 것입니다.
해결책은 매우 간단합니다. 명명된 열을 명시적으로 선택하려면 투영을 확장해야 합니다.그런 다음 중복 열을 생략하고 코치를 유지할 수 있습니다.ID 또는 열 별칭 사용:coaches.id as COACHES_ID.
타이핑을 많이 하는 것 같지만, 그게 유일한 방법이에요.그게 조금이라도 위안이 된다면SELECT *제품 코드의 불량 관행으로 간주됩니다.명시적으로 명명된 컬럼이 훨씬 안전합니다.
내부 쿼리에 동일한 이름의 열이 여러 개 있으므로 외부 쿼리에서 오류가 발생합니다.외부 쿼리를 삭제해도 여전히 혼란스럽지만 실행되어야 합니다.
SELECT DISTINCT
coaches.id,
people.*,
users.*,
coaches.*
FROM "COACHES"
INNER JOIN people ON people.id = coaches.person_id
INNER JOIN users ON coaches.person_id = users.person_id
LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id
WHERE
rownum <= 25
각 테이블에서 필요한 필드를 모두 선택하는 것이 아니라 정확하게 지정하는 것이 (가독성과 성능을 모두 위해) 훨씬 좋습니다.그런 다음 서로 다른 테이블에서 동일한 것으로 불리는 두 개의 필드가 필요한 경우 열 별칭을 사용하여 구분합니다.
또한 대응하는 열이 null일 수 있는 결합을 선택할 때도 이 오류를 볼 수 있습니다.
select * from (select D.dept_no, D.nullable_comment
from dept D
union
select R.dept_no, NULL
from redundant_dept R
)
이것은 파서를 혼란스럽게 합니다.해결 방법은 항상 늘 null 열에 컬럼에 에일리어스를 할당하는 것입니다.
select * from (select D.dept_no, D.comment
from dept D
union
select R.dept_no, NULL "nullable_comment"
from redundant_dept R
)
에일리어스는 대응하는 컬럼과 같을 필요는 없지만 결과의 컬럼헤더는 조합원 중 첫 번째 쿼리에 의해 구동되므로 좋은 프랙티스가 될 수 있습니다.
SELECT DISTINCT
per_all_people_f.EMPLOYEE_NUMBER
, MAX(per_all_people_f.LAST_UPDATE_DATE)
, per_all_people_f.KNOWN_AS FULL_NAME
, to_char(notified_termination_date, 'DD-MM-YYYY') AS termination_date
, :FROM_DATE DATE1
, :TO_DATE DATE2
-- , D_LEAVING_REASON AS D_LEAVING_REASON
, CASE substr(substr(hr_all_organization_units_tl.NAME, instr(hr_all_organization_units_tl.NAME, '.') + 1), 1, 1)
WHEN 'B' THEN
'إدارة الاتصالات وتقنية المعلومات'
WHEN 'C' THEN
'إدارة المشاريع'
WHEN 'D' THEN
'الإدارة القانونية'
WHEN 'E' THEN
'إدارة الصحه والسلامة والبيئه'
WHEN 'F' THEN
'إدارة هندسة المكامن والانتاج'
WHEN 'G' THEN
'إدارة الهندسة'
WHEN 'H' THEN
'إدارة العمليات'
WHEN 'J' THEN
'إدارة الحفر وصيانة الآبار'
WHEN 'K' THEN
'إدارة المواد'
WHEN 'L' THEN
'إدارة النقل والخدمات'
WHEN 'M' THEN
'إدارة الاستكشاف'
WHEN 'N' THEN
'إدارة فرع بنغازي'
WHEN 'P' THEN
'إدارة التخطيط'
WHEN 'R' THEN
'إدارة المالية'
WHEN 'T' THEN
'إدارة المراجعه'
WHEN 'W' THEN
'إدارة التدريب والتطوير'
WHEN 'Y' THEN
'إدارة شؤون الموظفين'
else case substr(substr(hr_all_organization_units_tl.NAME, instr(hr_all_organization_units_tl.NAME, '.') + 1), 1, 3)
WHEN 'A11' THEN
'لجنة المناقصات'
WHEN 'A10' THEN
'لجنة الادارة'
WHEN 'A12' THEN
'قسم الاعلام '
end
END DEPARTMENT
, CASE d_leaving_reason
WHEN 'Retirement' THEN
'التقاعد'
END
LEAVING_REASON1
FROM per_all_people_f
LEFT JOIN per_periods_of_service_v ON per_all_people_f.person_id = per_periods_of_service_v.person_id
LEFT JOIN per_assignments_f ON per_all_people_f.EMPLOYEE_NUMBER = per_assignments_f.ASSIGNMENT_NUMBER
LEFT JOIN hr_all_organization_units_tl ON per_assignments_f.ORGANIZATION_ID = hr_all_organization_units_tl.ORGANIZATION_ID
WHERE notified_termination_date >= TO_DATE(:FROM_DATE,'MM-YYYY') AND notified_termination_date <= TO_DATE(:TO_DATE,'MM-YYYY')
-- AND D_LEAVING_REASON = 'Retirement'
AND CURRENT_EMPLOYEE_FLAG IS NULL AND employee_number IS NOT NULL
GROUP BY EMPLOYEE_NUMBER,d_leaving_reason,LAST_UPDATE_DATE,KNOWN_AS,notified_termination_date
,:FROM_DATE,:TO_DATE,NAME
언급URL : https://stackoverflow.com/questions/6233086/ora-00918-column-ambiguously-defined-in-select
'programing' 카테고리의 다른 글
| jquery 송신 폼을 전송한 후 기존 div에 결과를 표시합니다. (0) | 2023.04.04 |
|---|---|
| MongoDB: 대소문자를 구분하지 않는 쿼리를 작성할 수 있습니까? (0) | 2023.04.04 |
| Oracle에서 AUTO_INCREMENT를 사용하여 ID를 생성하는 방법 (0) | 2023.03.25 |
| Woocommerce 관리 주문 편집 페이지에서 프로그래밍 방식으로 주문 노트를 추가합니다. (0) | 2023.03.25 |
| TypeError: window.initMap은 함수가 아닙니다. (0) | 2023.03.25 |