#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
, поэтому в любом случае его будет сложно перенести.