【问题标题】:How EXISTS works in the oracle SQL?EXISTS 在 oracle SQL 中是如何工作的?
【发布时间】:2014-10-23 03:52:00
【问题描述】:

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

 SELECT PORT_ID
 FROM PORTS P1
 WHERE EXISTS 
 (SELECT * FROM SHIPS S1
 WHERE P1.PORT_ID = S1.HOME_PORT_ID);

假设PORT_IDHOME_PORT_ID 列中有一些行共享相同的值,这意味着WHERE 子句中的子查询返回TRUE

我想知道将选择哪些行。是选择表中的所有PORT_ID PORTS 还是只选择等于HOME_PORT_IDPORT_ID

【问题讨论】:

    标签: sql oracle exists


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      返回来自 PORTS 且其值存在于 SHIPS 表的 HOME_PORT_ID 列中的所有 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的主键索引(将存在)

      【讨论】:

        猜你喜欢
        • 2015-04-23
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        相关资源
        最近更新 更多