2016-06-13 81 views
0
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 
+0

这个问题还不太清楚。这个查询有什么问题?你究竟想达到什么目的? – Mureinik

+0

这可以用内联视图来完成。像最大的领域是重新结构的条件rownum = 1 – user1954762

+1

它仍然不清楚。您没有非聚集字段或分组依据,因此无论如何,结果集中只有一行。编辑问题以显示具有初始数据的示例,现在获得的内容以及要查看的内容(以及原因)。 –

回答

0

在查询栏中没有必要inlineview: - 如果这是改写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语句。如View部分所述,视图是具有表格特性的虚拟表格,但不包含任何实际数据。在内联视图结构中,不是在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,我们看到唯一的区别是我们用查询3中的内联视图语句替换查询2中的临时表名称。其他所有内容都保持不变。

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

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