2012-04-03 3 views
0

일부 ID가 겹치는 두 테이블을 작성하십시오.이상한 DB2 범위

create table outer_table (
    id integer, 
    overlap_in smallint default 0 
); 
create table inner_table (
    inner_id integer 
); 

다음으로 몇 가지 공통점이있는 ID로 채우십시오.

insert into outer_table(id) values 0, 1, 2, 3, 4, 5, 6, 7, 8, 9; 
insert into inner_table(inner_id) values 0, 1, 2; 

다음으로 중첩 표시기를 업데이트하십시오. 실수로 잘못된 열 이름을 입력하면 "inner_id"대신 "id"라고 쓰고 별칭을 사용하지 않기로 결정했습니다.

update outer_table o 
set o.overlap_in = 1 
where o.id in (select id from inner_table); 

결과 : 그것은 outer_table

의 모든 행에 overlap_in 필드에 1을 업데이트

  • 방법이도 정상입니다

    1. 없음 SQL 오류? db2가 이것을 허용하는 이유는 무엇입니까?

      주 : DB2 버전 :

      >db2level 
      DB21085I Instance "....." uses "64" bits and DB2 code release "SQL09075" 
      with level identifier "08060107". 
      Informational tokens are "DB2 v9.7.0.5", "...", "IP23285", and Fix Pack 
      "5". 
      
  • 답변

    2

    이것은 정상, 예상되는 동작. 대부분의 모든 프로그래밍 언어에서와 같이 식별자는 SQL에서 이와 같은 방법으로 해결됩니다. 가장 안쪽 범위에 식별자가 없으면 이름 확인이 바깥 쪽에서 작동합니다. 가장 안쪽 범위에 "id"라는 열이없는 경우 열 이름은 해당 범위를 벗어나서 확인됩니다. 여기서 "id"는 o.id로 해석됩니다. 항상 테이블 접두사를 사용해야합니다!

    당신이 식별자 "ID가"그것은 당신의 예에처럼 o.id으로 해결해야 할 확실히 것
    where exists (
        select * from inner_table 
        where inner_table.inner_id = id 
    ) 
    

    을 작성했다 가정하자. 하위 쿼리 내에서 쿼리의 다른 테이블의 열을 참조 할 수없는 경우 바보입니다.

    그런데 FROM 절이 포함 된 하위 쿼리에 언급 된 열이 하나뿐이기 때문에 일부 SQL 구현이 위와 같은 쿼리 플래그를 지정하는 정상 성 검사를 수행 할 수 있다면 좋을 것입니다. subquery의 테이블. 그렇지 않은 경우 일반적으로 오타입니다 (그러나 여전히 법적 쿼리).