SQL嵌套选择From caluse

时间:2016-12-08 07:12:38

标签: sql oracle

我很困惑,我们可以在 FROM 子句中编写SELECT语句,如果是,为什么会这样。

SELECT v.employee_id, v.last_name, v.lev 
   FROM 
      (SELECT employee_id, last_name, LEVEL lev 
      FROM employees v
      START WITH employee_id = 100 
      CONNECT BY PRIOR employee_id = manager_id) v 
   WHERE (v.employee_id, v.lev) IN
      (SELECT employee_id, 2 FROM employees); 

3 个答案:

答案 0 :(得分:1)

我认为你在sql server中寻找一个递归的cte,就像......

WITH X (employee_id, last_name, lev )
AS (

    SELECT employee_id, last_name, 0 AS lev 
    FROM employees 
    WHERE manager_id IS NULL

    UNION ALL 

    SELECT e.employee_id, e.last_name , lev + 1
    FROM employees e
    INNER JOIN x ON x.employee_id = e.manager_id

   )
SELECT v.employee_id, v.last_name, v.lev 
FROM X
WHERE lev = 2

答案 1 :(得分:1)

可能有多种原因。在from子句中编写任何选择查询都会创建内联视图。

这是我能想到的,

  1. 从查询中获得前N个结果。
  2. 您可能希望通过限制from子句本身来限制数据。
  3. 查看我的前n个查询的答案。

    How do I limit the number of rows returned by an Oracle query after ordering?

答案 2 :(得分:1)

答案是肯定的,你可以使用。 from中的select子句将充当内联视图(将其视为数据库创建以保存结果的临时表)。 例如:

    SELECT sdt sdat
      FROM (SELECT SYSDATE sdt FROM dual);

在上面的查询中,首先执行SELECT SYSDATE sdt FROM dual,输出如下:

    sdt
    ---
    08-Dec-2016 16:20:56

然后,使用它作为临时表(在这种情况下称为内联视图),oracle将对此数据执行外部选择。因此SELECT sdt FROM ...执行,最终输出为:

    sdat
    ----
    08-Dec-2016 16:20:56