Как написать запрос в гибернации с присутствующей в нем функцией row_number?

#sql #hql

#sql #hql

Вопрос:

Я хочу преобразовать следующий запрос в HQL

 select X.* from (select tbl.*,ROW_NUMBER() over (partition by Col1 order by Col1) as RANK from table1 tbl where tbl.col2='22'
                    and (
                        tbl.col3 in (
                            'ABC'
                        )
                    ) 
              ) X
             WHERE X.rank = 1;
  

Требуется помощь.
Это в контексте преобразования MySQL group by в эквивалентную group by в Oracle.

Редактировать: Мой исходный запрос MySQL

 select * from table1 tbl 
where tbl.col2='22'
and tbl.col3 in ('ABC','XYZ')
group by col1;
  

Я хочу сначала преобразовать его в эквивалентный запрос Oracle, а затем в HQL.

Ответ №1:

Я думаю, что ваш запрос очень близок к этому запросу:

 select X.*
from table1 tbl
where tbl.col2 = '22' and tbl.col3 = 'ABC' and
      not exists (select 1
                  from table tbl2
                  where tbl2.col2 = tbl.col2 and tbl2.col3 = tbl.col3 and
                        tbl2.col1 < tbl.col1
                 );
  

Единственное различие заключается в том, как два запроса обрабатывают связи col1 . Это вернет все такие значения. Ваш вернет только один из них.

Возможно, это сработает для вас в HQL.

Комментарии:

1. Что, если Col1 не является числовым типом данных?

2. Вышеуказанное должно работать как в Oracle, так и в MySQL, а также, скорее всего, в HQL. < Оператор работает для большинства типов данных SQL.

3. Моя цель — имитировать group by, ваш запрос может возвращать дубликаты, если для col1 есть повторяющиеся значения

4. @user3705949 . , , Это можно исправить, если у вас есть уникальный идентификатор в таблице. Ваш исходный запрос использует расширение только для MySQL group by , поэтому в любом случае его будет сложно перенести.