重组内联视图

时间:2016-06-13 10:07:12

标签: oracle query-tuning inline-view

SELECT MAX(column1)
FROM table1 B , table2 A, table3 H
WHERE B.unit=A.unit
AND B.value=A.value
AND B.unit=H.unit
AND B.value=H.value
AND A.number=1234

有人可以帮我在内联视图中重构此查询吗?

样品

Table1
------
Value  Unit 
001    A1
002    B1
003    C2
002    A1

Table2
--------
Value  Unit  Number
001    B4        11
002    B1      1234
004    B1        22

TABLE3
-------
VALUE  UNIT  NUMBER  COLUMN1
001    B4        11      555
002    B1      1234      557
002    B1      1234      559

OUTPUT
------
MAX(C0LUMN1)
-----------
559

2 个答案:

答案 0 :(得分:0)

  

我需要显示其他表中具有最大列值

的列
SELECT MAX( H.column1 ) AS max_column1,
       MAX( A.number ) KEEP ( DENSE_RANK LAST ORDER BY H.column1 ) AS max_number
FROM   table1 B
       INNER JOIN table2 A
       ON ( B.unit = A.unit AND B.value = A.value )
       INNER JOIN table3 H
       ON ( B.unit = H.unit AND B.value = H.value )
WHERE  A.number=1234

答案 1 :(得分:0)

在您的查询中,不需要内联视图: - 如果在内联视图中重写它就像

Select Max(Column1)
 From  (Select Value,Unit From Table1)B,
(Select Value,Unit,Number From Table2)A,
 Table3 as H
 Where B.Unit=A.Unit
 And B.Value=A.Value
AND B.unit=H.unit
And B.Value=H.Value
AND A.number=1234;

以下是使用内联视图的示例,希望对此有所帮助!!!

内联视图是FROM子句中的SELECT语句。如“视图”部分所述,视图是一个虚拟表,它具有表的特征但不包含任何实际数据。在内联视图构造中,数据源实际上来自在SQL语句中创建的视图,而不是在FROM关键字之后指定表名。内联视图的语法是

SELECT "column_name" FROM (Inline View);

我们什么时候应该使用内嵌视图?以下是一个例子:

假设我们有两个表:第一个表是User_Address,它将每个用户映射到邮政编码;第二个表是User_Score,它记录每个用户的所有分数。问题是,如何编写SQL查询以查找每个邮政编码得分高于200的用户数量?

不使用内联视图,我们可以分两步完成:

查询1

CREATE TABLE User_Higher_Than_200
SELECT User_ID, SUM(Score) FROM User_Score
GROUP BY User_ID
HAVING SUM(Score) > 200;

查询2

SELECT a2.ZIP_CODE, COUNT(a1.User_ID)
FROM User_Higher_Than_200 a1, User_Address a2
WHERE a1.User_ID = a2.ZIP_CODE
GROUP BY a2.ZIP_CODE;

在上面的代码中,我们引入了一个临时表User_Higher_Than_200,用于存储得分高于200的用户列表。然后使用User_Higher_Than_200加入User_Address表以获得最终结果。

We can simplify the above SQL using the inline view construct as follows:

查询3

     SELECT a2.ZIP_CODE, COUNT(a1.User_ID)
        FROM
        (SELECT User_ID, SUM(Score) FROM 
        User_Score GROUP BY User_ID HAVING SUM(Score) > 200) a1,
        User_Address a2
        WHERE a1.User_ID = a2.ZIP_CODE
        GROUP BY a2.ZIP_CODE;

这里使用内联视图有两个好处:

  1. 我们不需要创建临时表。这可以防止数据库中包含太多对象,这是一件好事,因为数据库中的每个附加对象都需要管理资源。

  2. 我们可以使用单个SQL查询来完成我们想要的任务 请注意,我们将内联视图视为与处理表完全相同。比较查询2和查询3,我们看到唯一的区别是我们用查询3中的内联视图语句替换查询2中的临时表名。其他所有内容保持不变。

  3. 内联视图有时称为派生表。这两个术语可互换使用。