2014-08-29 55 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); 

比方說,有一些股票在columna PORT_IDHOME_PORT_ID相同的值,這意味着在WHERE條款回報TRUE子查詢一些行。

我想知道哪些行將被選中。表中所有PORT_IDPORTS會被選中還是隻有PORT_ID等於HOME_PORT_ID會被選中?

回答

1

只有在ports中具有ships(使用謂詞P1.PORT_ID = S1.HOME_PORT_ID)中匹配行的行纔會顯示。

這意味着如果ships中沒有行且port_id相同,則不會顯示ports的行。

+0

您的回答非常明確。非常感謝你! – 2014-08-29 18:20:50

1

返回其值位於SHIPS表的HOME_PORT_ID列中的端口的所有PORT_ID值。

您的查詢,曾經詢問船舶的每一行港口,可以更有效地改寫爲:

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

只查詢SHIPS一次。但它可以更有效地改寫爲:

SELECT DISTINCT PORT_ID 
FROM PORTS 
JOIN SHIPS ON PORT_ID = HOME_PORT_ID 

這將能夠有效地使用索引上HOME_PORT_ID如果存在的話,或者如果不能做到這一點:

SELECT DISTINCT HOME_PORT_ID 
FROM SHIPS 
JOIN PORTS ON PORT_ID = HOME_PORT_ID 

將使用主鍵索引PORT(將存在)