代码之家  ›  专栏  ›  技术社区  ›  Peter Kofler

查询在PostgreSQL中工作,但在HSQL中失败。我怎么修?

  •  2
  • Peter Kofler  · 技术社区  · 14 年前

    我有以下查询(继承自传统),类似于

    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 db,但是查询失败了

    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:my hsql安装程序适用于所有其他测试,因此它正在工作和执行。

    2 回复  |  直到 14 年前
        1
  •  2
  •   fredt    14 年前

    某些SQL方言支持带限制和偏移量的ORDER BY子查询,但并非全部支持。

    hsqldb 2.0支持这一点。从下载最新快照jar http://hsqldb.org/support/ 它们有错误修复,并且更兼容Postgres和其他方言。

    最新的Hibernate3.5.5和3.5.6包括一种与快照jar以及hsqldb 1.8.x兼容的方言。

    如果您对SQL查询和hsqldb 2.0有任何问题,您可以报告它,它将被及时修复。

        2
  •  0
  •   Matthew Wood    14 年前

    我的猜测是,您需要明确说明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中。原来的看起来像是ORDERBY与联合中的第二个select匹配。