2010-07-12 59 views
0

我有一個查詢,我正在做內部正在被內部加入的派生表內的訂單。HSQLDB 1.8無法在派生表中進行排序?

例:

SELECT g.* 
FROM (
    SELECT ... 
    FROM ... 
    ORDER BY alias.some_column 
    LIMIT 0, 20 
) as g 
... # other joins 

這工作在MySQL很好,但它在HSQLDB失敗。我在這裏放置順序的原因是,mysql比將ORDER BY放入外部查詢要快得多。這是一場純粹的表演勝利。但是,HSQLDB抱怨。

這是例外:

WARN JDBCExceptionReporter:100 - SQL Error: -70, SQLState: 37000 
ERROR JDBCExceptionReporter:101 - Cannot be in ORDER BY clause in statement [SELECT g.* FROM gallery g LEFT OUTER JOIN preview p  ON p.id = g.preview_id INNER JOIN (  SELECT g.id, g.date_created  FROM gallery g  WHERE g.published = true  ORDER BY g.date_created DESC  LIMIT 0, 20 ) as g_ids on g_ids.id = g.id ] 

這是一個大問題,因爲我的測試中使用HSQLDB,但生產系統的MySQL。我可以將這些測試作爲「Exceptions」移動,並針對mysql運行,但速度要慢得多......並且使生產系統變得更慢,只是爲了讓測試通過而失敗測試點。

我可以重構我的測試,以使用mysql進行一些測試,而不是一攬子使用hsqldb的一切......這對我來說是一個很大的測試框架變化。那麼有沒有辦法讓hsqldb發揮出色呢,還是我必須改進我的測試框架?

謝謝!

+0

僅供參考:SQL代表「結構化查詢語言」,而不是「標準查詢語言」。可移植的SQL是我們追求的目標,但是直到查詢被測試之後纔會有保證。 – 2010-07-12 18:21:31

回答

0

我會說改善你的測試框架。在一個平臺上編寫並部署在另一個平臺上總是很危險。

+0

我升級到2.0,似乎已經解決了這個問題。如果我需要對mysql運行該套件,我可以將它切換到1個文件並運行該套件。對於反覆運行mysql的測試只是很煩人。 – egervari 2010-07-12 22:46:14

0

除了更改測試框架外,還有一種選擇是考慮使用較新版本的HSQLDB或使用其他Java數據庫。有Apache Derby(不幸的是不支持LIMIT)和H2數據庫引擎。