2016-06-13 82 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