programing

ORA-00918: SELECT에 모호하게 정의된 열 *

golfzon 2023. 4. 4. 22:36
반응형

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

반응형