2010-09-17 65 views
2

我有以下查詢(從傳統的繼承)類似查詢在PostgreSQL中可用,但HSQL失敗。我該如何解決它?

SELECT bla FROM table 
WHERE 
    some.id IN ( 
    SELECT id FROM (

     SELECT some FROM tag WHERE bla 
     UNION 
     SELECT some FROM dossierinfo WHERE bla 
     ORDER BY tag LIMIT :limit OFFSET :offset 

    ) AS aggregated 
    WHERE dossier_type = 'auto' 
) 
) 

完整的SQL是在底部。問題是在PostgreSQL 8.2.x中執行得很好。爲了測試我增加了一個嵌入式HSQL 1.8.x的分貝,但隨後的查詢失敗,

07 Sep 2010 13:55:11.914 [WARN] [main] [org.hibernate.util.JDBCExceptionReporter] - SQL Error: -11, SQLState: 37000 
07 Sep 2010 13:55:11.914 [ERROR] [main] [org.hibernate.util.JDBCExceptionReporter] - Unexpected token ORDER, requires) in statement [...] 

所以我想不通,HSQL不喜歡內的訂單加入。

  • 此命令不正確的SQL?
  • 正在將HSQL升級到2.0值嗎?它會支持這個命令嗎?我很快嘗試過,但遇到了一些問題。
  • 重寫查詢不是一個選項,我只是想爲它添加一個測試。

完整的查詢:

SELECT *, article_count as articlecount FROM tag 
WHERE 
    tag.id IN ( 
    SELECT id FROM (

     SELECT tag.tag AS tag, tag.id as id, tag.article_count as articleCount, 'auto' AS dossier_type FROM tag   
      WHERE tag.tag_count >= :minimumTagCount AND tag.article_count >= :minimumArticleCount AND 
      LENGTH(tag.tag) >= :minimumTagLength AND 
      tag.tag NOT IN (SELECT dossierinfo.name FROM dossierinfo) AND tag.is_stopword = :stopword 
     UNION 
     SELECT dossierinfo.name AS tag, dossierinfo.id AS id, dossierinfo.article_count as articleCount, 
      'manual' AS dossier_type FROM dossierinfo 
     WHERE dossierinfo.article_count >= :minimumArticleCount 

     ORDER BY tag LIMIT :limit OFFSET :offset 

    ) AS aggregated 


    WHERE dossier_type = 'auto' 
) 
) 

PS:我的HSQL設置適用於所有其他的測試,所以它的工作和執行。

回答

1

具有LIMIT和OFFSET的子查詢中的ORDER BY由一些SQL方言支持,但不是全部。

HSQLDB 2.0支持這個。從http://hsqldb.org/support/下載最新的快照文件包,它們有錯誤修復,並且與Postgres和其他方言更兼容。

最新的Hibernate 3.5.5和3.5.6包含一個與快照JAR以及HSQLDB 1.8.x兼容的方言。

如果您在使用SQL查詢和HSQLDB 2.0時遇到任何問題,您可以報告並立即修復。

+0

正如我想......我會嘗試更新HSQLDB然後。 – 2010-09-18 06:44:28

+0

終於有時間嘗試升級。直接使用2.0.0而不是1.8.0.10。就我的代碼而言,只有'org.hsqldb.ServerConstants' - >'org.hsqldb.server.ServerConstants'。不幸的是,現在查詢失敗,並且在「派生表中重複列名」。這是由於Hibernate 3.4.0 GA嗎? – 2010-10-18 13:21:38

+1

我沒有看到你最後的評論。問題是「SELECT \ *,article_count as articlecount FROM tag」使用「SELECT tag。*,article_count as articlecount FROM tag」。 「SELECT *」不能添加額外的元素。 – fredt 2010-10-28 19:38:16

0

我的猜測是,你需要明確要什麼ORDER BY指:

取而代之的是:

SELECT some FROM tag WHERE bla 
UNION 
SELECT some FROM dossierinfo WHERE bla 
ORDER BY tag LIMIT :limit OFFSET :offset 

試試這個:

SELECT some FROM (
     SELECT some FROM tag WHERE bla 
     UNION 
     SELECT some FROM dossierinfo WHERE bla 
) AS union_data 
ORDER BY tag LIMIT :limit OFFSET :offset 

我會做到這一點無論如何,即使在PostgreSQL中。原始外觀像ORDER BY與UNION中的第二個SELECT一起使用。

+0

我在第一個地方嘗試了類似的東西,但沒有奏效。我不確定它是否完全像你的想法,所以我會再試一次,讓你更新... – 2010-09-18 06:42:34

相關問題