2017-03-22 11 views
1
select * 
from table1 t1, 
    table2 t2, 
    table3 t3 
where t2.parent_id = t1.row_id 
    and t2.xyz is not null 
    and (
     select count(*) 
     from table3 
     where xyz = t2.row_id 
     ) = 0; 

작동 여부 내 하위 쿼리에서 별칭 t2를 사용하고 있습니다.WHERE 절의 개수 지정

필자의 요구 사항은 table3의 열 xyz가 table2의 row_id로 저장되는 table3에 레코드가 없다는 where 절의 조건을 지정하는 것입니다.

+0

사용중인 SQL 버전을 직접 확인해 보셨습니까? count 서브 쿼리 대신에 WHERE NOT EXISTS를 사용할 수도 있습니다. 현재'table2'와'table3' 사이에서 교차 결합을하고 있습니다. 아마도 의도 한 것과 다를 것입니다. –

+0

스택 교환 하위 사이트 코드 검토에있을 수 있습니다. – Edward

+0

오늘의 팁 : 모던하고 명시적인'JOIN' 구문으로 전환하십시오! (아래의 @ GurV의 대답과 같습니다.) – jarlh

답변

2

NOT EXISTS을 사용하여 하위 쿼리에서 반환 된 행이 없다고 주장 할 수 있습니다. 쉼표 기반 레거시 구문 대신 현대식 명시 적 조인 구문을 사용하십시오. 외부에 table3에 가입 할 필요가 없습니다 (효과적으로 교차 결합을하고있었습니다).

select * 
from table1 t1 
join table2 t2 on t2.parent_id = t1.row_id 
where t2.xyz is not null 
    and not exists (
     select 1 
     from table3 
     where xyz = t2.row_id 
     );