EXISTS如何在oracle SQL中运行?

时间:2014-08-29 06:59:13

标签: sql oracle exists

Oracle SQL初学者,我对EXISTS有一些疑惑。这是一个例子:

 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_ID中的所有PORTS都会被选中,还是只会选择PORT_ID HOME_PORT_ID {/ 1}}?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

返回来自PORTS的所有PORT_ID值,其值存在于SHIPS表的HOME_PORT_ID列中。

您的查询可以在PORTS中为每一行查询SHIPS一次,可以更有效地重写:

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的主键索引(将存在)