2013-10-25 45 views
0

我試圖提取從ClearQuest這是運行背後一個漂亮的基於Eclipse的前端Oracle數據庫的數據。使用內置的查詢構建器我不能限制數據的提供量足以讓我找到我想要的地方。SQL語句引起ORA-00907:缺少右括號

我的目的:我希望從兩個表中提取數據。表2有許多一對一的關係表1。當從我希望提取從表2中已在表1

我嘗試到指定的記錄集的關係的最新記錄數據庫中提取數據:我開始編寫一個簡單的查詢,使用第二個select來獲取表2中的最新記錄。我無法在我的機器上安裝oracle服務器,因此不得不在MySQL中嘗試查詢並將其調整爲oracle。這是查詢:

select t1.id, t1.name, t2.set_date 
from test_table t1, link_table t2 
where t2.test_id = t1.id 
     and t2.set_date = (select set_date 
         from link_table 
         where t1.id = test_id 
         order by set_date desc 
         limit 1) 
     and t1.state = 'Closed'; 

在MySQL中運行此工作正常! 更改查詢以符合Oracle標準給我這個;

SELECT t1.id,t1.name,t2.set_date 
FROM test_table t1,link_table t2 
WHERE t2.test_id = t1.id 
     AND t2.set_date = (SELECT set_date 
          FROM link_table 
          WHERE t1.id = test_id 
           AND ROWNUM = 1 
          ORDER BY set_date DESC) 
     AND t1.state = 'Closed'; 

當測試通過一個Oracle格式化運行它(如Instant SQL Formatter)它通過細運行哪個。但是,當將查詢輸入到ClearQuest中以提取數據時,它會給我提供錯誤; ORA-00907: missing right parenthesis

我已經嘗試了所有這早上發生變化,無法得到它的工作。我錯過了什麼?

+0

根據[本支持響應(http://www-01.ibm.com/support/docview.wss?uid=swg21121098),嵌套的SQL語句不支持。這可能是一個解釋嗎? –

+0

這當然可以解釋。問題是,我不能真正避免使用嵌套選擇(至少不是我所知...)。 – Sander

回答

2

可以嘗試下面的代碼: - 相對於嵌套查詢使用分析查詢性能提高。

select t1.id,t1.name,t2.set_date 
FROM test_table t1,(select * from (select set_date,test_id,row_number() over (partition by test_id order by set_date desc) rn from link_table) where rn =1) t2 
WHERE t2.test_id = t1.id AND t1.state = 'Closed'; 

我無法測試相同。請回復的情況下,你會遇到的問題

+0

查詢完成後,我會盡快進行測試。 – Sander

+0

這是偉大的!我肯定會看到性能提升 – user2342436

+0

好吧!碰巧5分鐘後程序崩潰了......我認爲這與我的桌面有點大有關。我將不得不導出大部分數據並在另一個程序中執行選擇。這雖然解決了錯誤的問題!謝謝! – Sander

0

我不認爲行號可以通過前處理的順序進行計算。因此它在子選擇內不可用。但是,如果您將子選擇別名並將rownum = 1添加到外部where子句中,它應該可以工作。

+0

我認爲它應該可以正常工作,刪除子查詢中的ORDER BY,就像您建議刪除生成的錯誤一樣。現在只需要坐一段時間來運行查詢(目前在5%,而不是移動...) – Sander

+0

https://forums.oracle.com/message/2696199這是我認爲它會工作的原因:D。但是,在from語句中一次內聯創建子查詢可能會更快/更高效,因此只需定購一次。而不是t1,t2中的每一行。我會嘗試下面列出的分區。在查詢中使用分析具有驚人的性能。 – xQbert