2017-12-14 1 views
0

쿼리 : MY_TABLE 반환 ORA-00904 잘못된 식별자 FROM
SELECT COLUMN_NAME MY_TABLE에는 COLUMN_NAME 열이 없기 때문에, 지금까지 너무 좋아.

은 쿼리 : OTHER_TABLE FROM
SELECT * COLUMN_NAME IN이
이뿐만 아니라 그것은 실패하지 않습니다 (MY_TABLE로부터 COLUMN_NAME를 선택), 그것은 전체 OTHER_TABLE를 반환합니다. 내부 쿼리가 "외부"테이블에있는 열을 선택하는 경우에만 발생합니다.
동일한 쿼리를 실행하고 내부 쿼리 선택 열을 테이블에 존재하지 않지만 테이블에도 존재하지 않는 다른 열로 변경하면
SELECT * FROM OTHER_TABLE WHERE COLUMN_NAME IN (SELECT DIFFERENT_NAME FROM MY_TABLE)****** OTHER_TABLE에 DIFFERENT_NAME 열이 없습니다. ORA-00904에 잘못된 식별자가 있습니다.

1. 외부 쿼리에 존재하지만 내부 쿼리에없는 열을 사용하는 쿼리가 어떻게 실패하지 않습니까?
2. 어떻게 전체 테이블을 반환합니까?
선택 * 테이블의 경우 열에서 (서브 쿼리) 여기서 서브 쿼리 리턴 ORA-00904

답변

0

in 절의 쿼리에서 "외부"테이블의 열을 사용할 수 있습니다. 외부 테이블의 각 행에 대해 해당 행의 값인 column_name이 내부 테이블에서 선택됩니다 (리터럴 값을 선택한 경우와 유사). 외부 쿼리의 행과 동일한 값인이기 때문에 분명히 동일하므로 조건이 충족되고 행이 반환됩니다.

: 같은 실수를 피하기 위해

좋은 수비 연습 대신 뭔가를 반환하는 당신이 기대하지 않는 쿼리가 에러 출력 할 수 있도록 완벽하게, 당신은 (바람직 테이블 별칭을 사용) 쿼리하고있는 열을 자격을하는 것입니다

SELECT * 
FROM other_table ot 
WHERE ot.column_name IN (SELECT mt.column_name -- causes error! 
          FROM my_table mt) 
0

우리는 두 개의 테이블이 있다고 가정 해 보겠습니다 필드 B 필드 ATATB을, 지금의 몇 가지 쿼리를 작성하자

select A -- wrong: TB doesn't have A field 
    from TB 

하지만이 사람은 OK 될 것입니다 전체 TB 테이블 B 필드가 null는 아니고, TA이 비어 있지 않은지 제공 반환 : 당신이

where B in (select B from TA) 

가 동일 할 수있다이 경우

select * 
    from TB 
    where B in (select B -- <- B is from TB in both cases 
       from TA) 

-- 1. null in (...) is null, not true 
    -- 2. we have not empty TA 
    where (B is not null) and Exists (select 1 from TA) 

그리고 마지막으로

select * 
    from TB 
    where B in (select C -- wrong: there's no field C in TB as well as in TA 
       from TA)