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_ID
和HOME_PORT_ID
中共享相同的值,这意味着WHERE
子句中的子查询返回TRUE
。
我想知道会选择哪些行。表格PORT_ID
中的所有PORTS
都会被选中,还是只会选择PORT_ID
HOME_PORT_ID
{/ 1}}?
答案 0 :(得分:1)
只有ports
中ships
(使用谓词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的主键索引(将存在)