【问题标题】:Restructure Inline view重构内联视图
【发布时间】:2016-06-13 10:07:11
【问题描述】:
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

【问题讨论】:

  • 这个问题很不清楚。这个查询有什么问题?你到底想达到什么目的?
  • 这可以用内联视图制作吗?像 max 字段将在条件 rownum =1 的情况下重新构造
  • 还不清楚。您没有非聚合字段或 group-by 子句,因此无论如何您在结果集中只有一行。编辑问题以显示包含初始数据、您现在获得的内容以及您希望看到的内容(以及原因)的示例。
  • 这仍然不能告诉我们你想要什么 - 你在输出中有一行。内联视图或 rownum 过滤器将实现什么?
  • 这是一个具有相同数据的示例输入...考虑具有百万行的表...其中 max 将返回 I/O 这可以使用 order by 和内联视图最小化

标签: oracle query-tuning inline-view


【解决方案1】:

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

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

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,我们看到唯一的区别是我们将查询 2 中的临时表名替换为查询 3 中的内联视图语句。其他一切都保持不变。

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2010-12-04
      • 1970-01-01
      • 2021-08-30
      • 2012-09-05
      相关资源
      最近更新 更多