如果有两个连续的连接,那么Oracle中第二个连接的输入是什么?

时间:2014-04-05 06:01:30

标签: sql oracle join

首先我有三张桌子:

  
      
  • 员工已与TRIP TABLE连接。
    TRIP与驾驶员表连接
  •   

我想要旅行表中所有卡车的列表以及驱动程序表中的驱动程序名称。

SELECT TRUCK.REG# , DRIVER.L#
FROM TRUCK
LEFT OUTER JOIN TRIP
ON TRUCK.REG# = TRIP.REG# 
LEFT OUTER JOIN DRIVER
ON DRIVER.L# = TRIP.L#
;

第一部分是行程表中的所有卡车都不在行程表中。

SELECT TRUCK.REG# , DRIVER.L#
FROM TRUCK
LEFT OUTER JOIN TRIP
ON TRUCK.REG# = TRIP.REG# 

我认为oracle使用TRIP创建一个TEMPORARY TABLE OF ALL TRUCK然后输入到第二部分:

LEFT OUTER JOIN DRIVER ON DRIVER.L#= TRIP.L#

是旅行表中的所有卡车的清单,旅途表在驾驶员表中有驾驶员。 这是对的吗?

现在,如果我们再添加一个表EMPLOYEE,我们想获得驱动程序的名称。我再次将外部联系到EMPLOYEE,即:

SELECT TRUCK.REG# , DRIVER.L#
FROM TRUCK
LEFT OUTER JOIN TRIP
ON TRUCK.REG# = TRIP.REG# 
LEFT OUTER JOIN DRIVER
ON DRIVER.L# = TRIP.L#
LEFT OUTER JOIN EMPLOYEE
ON EMPLOYEE.E# = DRIVER.E#
;

最后,ORACLE和SQL之间是否有区别对待sql命令?

1 个答案:

答案 0 :(得分:1)

你可以知道Oracle做了什么的唯一方法是在跟踪会话时运行它,并检查那里给出的解释计划(在11g及以上有一些更简单的方法来做,看看你有的列在V $ SESSION内。)

您还可以要求数据库向您显示查询的解释计划,大多数机会(超过90%)您将获得DBMS为此查询运行的正确执行计划。

请注意,没有“正确”的答案。 Oracle使用其统计信息来构建执行计划,只要最终结果是正确的 - Oracle将使用最有效的方法(这可能意味着完全相反的顺序而不是直观的方法)。

我想说的是 - 这里没有人可以告诉你什么是连接中的“内部”或“外部”表,只有引擎可以 - 因为它取决于它所持有的当前统计数据。
在多个左外连接的情况下,正确性的顺序必须是特定的,但不是跨表(例如,1左外连接2左外连接3可能工作为2和3,而不是1 - 或1和2和3)。