2010-03-10 2 views
1

나는 일대 다 관계가있는 두 개의 테이블 A와 B가 있습니다.자식 테이블의 일치하는 레코드가 ANSI SQL에 존재하는지 찾는 쿼리 테이블

이제 B에서 일치하는 레코드가 있는지 보여주는이 존재 필드가있는 일부 레코드를 원합니다. B가 SQL 실행을 지연시키는 레코드가 너무 많아서 count 함수를 사용하고 싶지 않습니다. 가능한 한 많은 호환성이 필요하므로 아래처럼 오라클의 rownum과 같은 독점적 인 키워드를 사용하고 싶지 않습니다.

select A.*, (
    select 1 from B where ref_column = A.ref_column and rownum = 1 
) existence 
... 

답변

0

EXISTS 절을 사용하십시오. B의 외래 키가 인덱싱되면 성능이 문제가되지 않습니다.

SELECT * 
FROM a 
WHERE EXISTS (SELECT 1 FROM b WHERE b.a_id = a.id) 
+0

B. – DylanYi

1

는 한 번만 수행됩니다에 가입하면서 어쨌든, 선택 목록에서 선택 문이 실행될 수있는 여러 번 계산 왼쪽 + 조인을 사용합니다. 또한

당신이 고려할 수있는 존재 :

select A.*, case when exists (
    select 1 from B where ref_column = A.ref_column and rownum = 1 
) then 1 else 0 end 
+0

하나에 일치하는 기록이없는 이는의 레코드를 반환하지 않습니다 코드 : 그 열 이름 (별명)을 추가합니다 . 'rownum '이 ANSI SQL이라고 생각하지 않습니다. SQL 서버에서는 대신 SELECT TOP 1이되고, MySQL에서는 LIMIT 1이됩니다. 실제로'ANSI SQL' 구현물을 얻으려면'LEUNT JOIN'이 필요합니다. 여기서'COUNT (*)'는'CASE WHEN COUNT (*) ... '로 대체 될 것입니다. – van

관련 문제