EXISTS如何在oracle SQL中工作?

问题描述:

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会被选中?

只有在ports中具有ships(使用谓词P1.PORT_ID = S1.HOME_PORT_ID)中匹配行的行才会显示。

这意味着如果ships中没有行且port_id相同,则不会显示ports的行。

+0

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

返回其值位于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(将存在)