복붙노트

[SQL] ORA-00918 : 모호 SELECT 정의 컬럼 *

SQL

ORA-00918 : 모호 SELECT 정의 컬럼 *

모호하게 정의 된 열 :이 SQL을 실행 ORA-00918 얻기 :

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

모든 제안을 기쁘게?

해결법

  1. ==============================

    1.쿼리의 투영 만 주어진 이름의 하나 개의 인스턴스를 가질 수 있습니다. 당신의 WHERE 절에서 볼 수 있듯이, 당신은 열라는 ID를 가진 여러 개의 테이블이있다. 당신이 * 선택되기 때문에 영사는 ID라는 여러 열이있을 것이다. 아니면 ORA-00918 던지기 컴파일러 아니 그것을했다 것입니다.

    쿼리의 투영 만 주어진 이름의 하나 개의 인스턴스를 가질 수 있습니다. 당신의 WHERE 절에서 볼 수 있듯이, 당신은 열라는 ID를 가진 여러 개의 테이블이있다. 당신이 * 선택되기 때문에 영사는 ID라는 여러 열이있을 것이다. 아니면 ORA-00918 던지기 컴파일러 아니 그것을했다 것입니다.

    이 솔루션은 매우 간단합니다 : 당신이 명시 적으로 명명 된 열을 선택하는 투사를 확장해야합니다. 그런 다음 중 단지 (말) COACHES.ID 또는 사용 열 별칭을 유지, 중복 된 열을 남길 수 있습니다 : coaches.id을 COACHES_ID한다.

    아마도 그 많은 타이핑으로 파업을하지만 유일한 방법입니다. 그것이 어떤 편안함 경우 SELECT *는 생산 코드의 나쁜 관행으로 간주되어 명시 적으로 명명 된 열이 훨씬 안전하다.

  2. ==============================

    2.당신은 오류가 외부 쿼리에서 발생하므로 여러 열, 내면의 쿼리에서 같은 일을 이름을 가지고있다. 당신이 외부 쿼리를 제거하면 여전히 혼동 될 수 있지만, 실행해야합니다 :

    당신은 오류가 외부 쿼리에서 발생하므로 여러 열, 내면의 쿼리에서 같은 일을 이름을 가지고있다. 당신이 외부 쿼리를 제거하면 여전히 혼동 될 수 있지만, 실행해야합니다 :

    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
    

    그것은 당신이 대신 어쨌든 그들 모두를 선택하는 각 테이블에서 필요한 필드를 정확하게 지정 훨씬 더 (가독성과 성능 모두)가 될 것입니다. 당신이 정말로 다른 테이블에서 같은 일이라는 두 개의 필드가 필요하면 다음 사용 열 별칭 그들을 구별한다.

  3. ==============================

    3.해당 열이 null이 될 수있는 노동 조합에 대한 선택하는 경우이 오류를 볼 수 있습니다.

    해당 열이 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
    )
    

    별명은 해당 컬럼과 동일하지 않지만, 아마 좋은 연습 그래서 결과에 열 머리글은 조합원 중에서 첫 번째 쿼리에 의해 구동된다.

  4. from https://stackoverflow.com/questions/6233086/ora-00918-column-ambiguously-defined-in-select by cc-by-sa and MIT license