2009-12-21 40 views
0

我想要使用的事實,在兩個表t1t2我可以使用on t1.colum1>t2.colum2內部連接來計算返回向量的最大壓差。問題是隻有兩個存儲的數據庫或表才能實現內部連接,而我只想選擇一部分表。Sql =想要使用內部連接語句,但不與表

是否有任何其他的可能性,我是全新的SQL,我找不到任何其他選項?

謝謝

編輯

操控着我的內心之前加入到能夠計算出我的最大跌幅我必須能夠使這個內部連接上表選擇,而不是表他們自己。所以我遵循馬克的建議,但我仍然得到一個錯誤。這裏是我的查詢:

select * 
from (select * from bars where rownum <= 10 as x)as tab1 
inner join (select * from bars where rownum <= 10 as y) as tab2 
on tab1.x=tab2.y 

的錯誤是ora-00907 missing right parenthesis

  • 從發佈爲回答這個職位OP的消息中提取出的附加信息。 *
+0

哪個DB? MS SQL? – 2009-12-21 00:04:10

+0

桌子的結構是什麼? – outis 2009-12-21 00:07:49

+0

馬克=這是一個oracle db outis =你是什麼意思的結構?我想要從中選擇的表格有數百萬行和大約10列 – user235693 2009-12-21 00:57:15

回答

0

(內部)連接不限於整個表格。

7

可以內部連接的子查詢也是如此,你只是需要給子選擇一個別名:

SELECT * 
FROM (SELECT 1 AS X) AS T1 
INNER JOIN (SELECT 1 AS Y) AS T2 
ON T1.X = T2.Y 

如果您發佈非工作查詢,我可以給你一個滿意的答案更根據您的確切表。

+0

嗨馬克,我做了這個查詢,使用別名,但它返回了一個錯誤,說我沒有找到表 – user235693 2009-12-21 00:57:46

+0

在工作中,我有沒有辦法安裝類似於dbartisan和下載數據庫所以我可以在家裏訓練?謝謝 – user235693 2009-12-21 00:58:37

+2

您是否可以更新問題以包含發生此錯誤的損壞查詢?如果我能看到你到目前爲止已經有多遠,那麼弄清楚你要去哪裏錯誤要容易得多。 – 2009-12-21 01:00:01

0

我從an investment website(感謝Google!)得到了最大虧損的定義。所以我認爲我們需要計算圖表中最高點與其後的最低點之間的下降百分比。

以下查詢計算過去12個月內Oracle股票投資的最大跌幅。它將investments表加入其自身,並使用別名來區分表格的版本(一個用於最高峯,一個用於最低谷)。這可能不會反映您的準確業務邏輯,但它會顯示Oracle爲您提供的SQL技術。

select round(((max_return-min_return)/max_return)*100, 2) as max_drawdown 
from 
    (select max(t1.return_amt) as max_return 
      , min(t2.return_amt) as min_return 
     from investments t1 
      join investments t2 
      on (t1.stock_id = 'ORCL' 
       and t2.stock_id = t1.stock_id 
       and t2.created_date > t1.created_date) 
     where t1.created_date >= add_months(sysdate, -12) 
     and t2.created_date >= add_months(sysdate, -12) 
    ) 
/

如果股票在窗口期間未經歷下跌,則此查詢將返回零。它也不檢查下面的上升趨勢(因爲我知道縮進它應該是谷底,一旦股價再次上漲,我們只能建立一個點)。

關於家庭培訓,我們可以從Oracle TechNet下載該軟件。如果帶寬或磁盤空間是Express Edition的問題,它沒有所有的功能,但你可能暫時不會需要它們。 Oracle提供免費的IDE,SQL Developer。顧名思義它主要針對開發人員,但它具有許多DB Artisan的面向DBA的功能。對於全數據庫管理,Oracle提供Enterprise Manager

編輯

在評論outis表明

你可以在加入作爲未成年人 優化添加t1.return_amt > t2.return_amt

我認爲這是不可能的,return_amt會索引,所以我認爲這樣的條款不太可能會影響業績。它會做的是改變沒有縮水的股票的行爲。我提出的查詢對於在整個時間窗口內持續增加的股票返回零。在這種情況下,額外的過濾器將返回NULL。更好的結果是味道(或需求規格)的問題。

+0

您可以在連接中添加't1.return_amt> t2.return_amt'作爲次要優化。 – outis 2009-12-21 08:57:00

+0

在我看來,我不認爲查詢會起作用,因爲'max(t1.return_amt)'可能來自不同於'min(t2.return_amt)'的行,這將撤銷't2.created_date> t1.created_date'。相反,在內部select中嘗試'max(t1.return_amt - t2.return_amt)'列。 – outis 2009-12-21 08:57:35

+0

由於默認連接是內部連接,因此在內部SELECT中沒有沒有縮進的股票會產生空的結果集,而不是具有NULL的行,從而導致外部SELECT也具有空的結果集? – outis 2009-12-23 15:32:54