2017-02-24 1 views
2

테이블 B의 모든 자식이 조건을 충족 할 때 부모 A의 행만 필요로하는 두 개의 테이블 A와 B가 있습니다. B에서 하나의 행이 기준을 충족시키지 못하면 상위 A 행이 필요하지 않습니다. 나는 여기에 존재하는 것을 사용할 필요가 있다고 생각하지만 어떻게 보여줄 수는 없다. 여기모든 하위 레코드가 조건을 충족 할 때 상위 레코드 만 선택하십시오.

은 데이터 테이블은 다음과 같습니다

표 A

Primary Key Level 
1 low 
2 low 
3 high 
4 high 
5 low 

표 B

Primary Key Phase Parent Primary Key 
1 open 1 
2 open 1 
3 close 1 
4 close 2 
5 close 2 
6 close 3 
7 open 4 
8 open 4 
9 open 5 
10 close 5 

그리고 쿼리 내가하려고했던 :

select * 
from table_a, table_b 
where table_a.level = 'low' and 
     table_b.phase = 'close' and 
     table_a.primary_key=table_b.parent_primary_key 

하지만 내 쿼리는 것 또한 th가있는 행을 반환합니다. e table_a.primary_key = 5

기본적으로 반환되는 유일한 행은 table_A.primary_key = 2로 레벨이 낮고 두 행의 위상이 닫음과 같을 때입니다.

감사합니다.

+0

당신은 * 정확히 * 같은 단어'low'과'와이 단일로 묶여 close'을 시도해 봤어 -quotes, 여전히 결과가 있습니까? 컴파일하지 않아야합니다 ("유효하지 않은 식별자"오류가 발생합니다). – mathguy

+0

아니요, 미안 해요. 나는 그것이 여기있는 방식대로 정확하게 게시하려고하는 데 문제가있었습니다. – confusedbeginner

+0

따옴표를 고정 –

답변

3

:

select a.* 
from table_a a 
where a.level = 'low' and 
     'close' = all (select phase 
        from table_b b 
        where b.parent_primary_key = a.primary_key 
       ); 
+0

도와 주셔서 감사합니다. 이것은 위대한 대안이다. – confusedbeginner

4

당신은 not exists 더블 부정적

select a.* 
from table_a a 
where a.level = 'low' and 
     not exists (select 1 
        from table_b b 
        where b.parent_primary_key = a.primary_key and 
         b.phase <> 'close' 
       ); 

을 원하는이입니다. 'close'이 아닌 다른 단계의 자녀가 없는지 확인합니다. 이는 기본적으로 모든 어린이가 'close'이라고 말하는 것과 같습니다. (NULL 값이 허용되는 경우, 논리는 정확히 동일하지 않습니다.) 또한

+0

예, 정말 고마워요! 이 상황에서 어떻게 존재하지 않는지 설명해주십시오. – confusedbeginner

+0

'. * 선택'이 있는데, 두 테이블의 모든 데이터를 출력으로 가져올 수있는 방법이 있습니까? – confusedbeginner

관련 문제