2014-08-29 5 views
1

Oracle SQL의 초보자 인 저는 EXISTS에 대해 약간의 혼동을 가지고 있습니다. 다음은 그 예이다 :EXISTS가 oracle SQL에서 어떻게 작동합니까?

SELECT PORT_ID 
FROM PORTS P1 
WHERE EXISTS 
(SELECT * FROM SHIPS S1 
WHERE P1.PORT_ID = S1.HOME_PORT_ID); 

이의는 WHERE 절 리턴 TRUE에서 하위 쿼리를 의미 COLUMNA PORT_IDHOME_PORT_ID에서 동일한 가치를 공유하는 일부 행이 있다고 가정 해 봅시다.

어떤 행을 선택할 지 궁금합니다. 표의 PORT_ID이 선택되거나 HOME_PORT_ID과 같은 PORT_ID이 선택됩니까?

답변

1

일치 행이 ships (술어 P1.PORT_ID = S1.HOME_PORT_ID 사용) 인 행만 표시됩니다 (ports).

즉, ships에 행이없고 port_id 인 행이없는 경우 ports 행은 표시되지 않습니다.

+0

답변은 매우 명확합니다. 대단히 고마워! –

1

SHIPS 테이블의 HOME_PORT_ID 열에 값이있는 PORTS의 모든 PORT_ID 값이 반환됩니다. 한 번만 선박을 조회

SELECT PORT_ID 
FROM PORTS 
WHERE PORT_ID IN 
(SELECT HOME_PORT_ID FROM SHIPS) 

: PORTS의 모든 행에 대해 한 번 배를 조회

질문은,로보다 효율적으로 쓸 수있다. 그러나 그것은 훨씬 더 효율적으로 쓸 수있다 등 : 효율적으로 존재하는 경우 HOME_PORT_ID에 인덱스를 사용하거나 수있는 것이다

SELECT DISTINCT PORT_ID 
FROM PORTS 
JOIN SHIPS ON PORT_ID = HOME_PORT_ID 

이 작업을 수행하지 않을 경우 : 기본 키 인덱스를 사용합니다

SELECT DISTINCT HOME_PORT_ID 
FROM SHIPS 
JOIN PORTS ON PORT_ID = HOME_PORT_ID 

PORT (존재할 것입니다)