Запрос работает в PostgreSQL, но не работает с HSQL. Как я могу это исправить? - PullRequest
2 голосов
/ 17 сентября 2010

У меня следующий запрос (унаследованный от унаследованного), аналогичный

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 не нравится ORDER во внутреннем соединении.

  • Не является ли этот порядок правильным 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 работает для всех остальных тестов, поэтому она работает и выполняется.

Ответы [ 2 ]

2 голосов
/ 17 сентября 2010

ORDER BY в подзапросе с LIMIT и OFFSET поддерживается некоторыми диалектами SQL, но не всеми.

HSQLDB 2.0 поддерживает это. Загрузите последние файлы снимков с http://hsqldb.org/support/, в которых исправлены ошибки и которые более совместимы с Postgres и другими диалектами.

Последние версии Hibernate 3.5.5 и 3.5.6 включают в себя диалект, совместимый с банками моментальных снимков, а также HSQLDB 1.8.x.

Если у вас есть какие-либо проблемы с запросами SQL и HSQLDB 2.0, вы можете сообщить об этом, и это будет быстро исправлено.

0 голосов
/ 17 сентября 2010

Полагаю, вам нужно четко указать, что относится к 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 идет со вторым SELECT в UNION.

...