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_ID
和HOME_PORT_ID
相同的值,这意味着在WHERE
条款回报TRUE
子查询一些行。
我想知道哪些行将被选中。表中所有PORT_ID
PORTS
会被选中还是只有PORT_ID
等于HOME_PORT_ID
会被选中?
答
只有在ports
中具有ships
(使用谓词P1.PORT_ID = S1.HOME_PORT_ID
)中匹配行的行才会显示。
这意味着如果ships
中没有行且port_id
相同,则不会显示ports
的行。
答
返回其值位于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(将存在)
您的回答非常明确。非常感谢你! – 2014-08-29 18:20:50