Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 pagination, java, jdbc, Generic sql  [new]
colacoca
Member

Откуда:
Сообщений: 8
Нужно реализовать сортировку по дате принятия на работу(hiredate(типа DATE)), не используя limit, offset, top, rownumber()
Я попытался пронумеровать строки и, отталкиваясь от этого сделать выборку. Помогите, пожалуйста, найти ошибки. Так как я понимаю, что решение далеко неправильное. Или же может быть предложите своё решение:)

WITH Results_CTE AS (select count (test_2.HIREDATE) as rank, test_1.ID, test_1.FIRSTNAME, test_1.LATNAME, test_1.MIDDLENAME, test_1.POSITION, test_1.MANAGER, test_1.HIREDATE, test_1.SALARY, test_1.DEPARTMENT
                            from test as test_1 inner join test as test_2 on
                            test_1.HIREDATE >= test_2.HIREDATE
                            group by test_1.HIREDATE
                            order by rank)
                            SELECT * FROM Results_CTE WHERE rank >= ? and rank < ?
11 ноя 20, 01:17    [22229912]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5596
colacoca,

При чём тут Java? :-)
11 ноя 20, 06:24    [22229927]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
colacoca
Member

Откуда:
Сообщений: 8
mad_nazgul, Вопрос изначально был в другом формате, я его отредактировал и забыл выбрать другую тему. В любому случае вопрос относится к JDBC, т.к. вместо "?" надо поставить условие пагинации.
11 ноя 20, 09:40    [22229960]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
colacoca,
Нет. Идите в форум бд и сделайте рабочий запрос.
Потом тут просто подставите вопросики где надо.
11 ноя 20, 10:11    [22229969]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
colacoca

count (test_2.HIREDATE) as rank

Дичь
colacoca

group by test_1.HIREDATE

еще большая дичь и нарушение синтаксиса SQL, о чем база должна сообщать

colacoca
Нужно реализовать сортировку по дате принятия на работу(hiredate(типа DATE))


1. Во вложенном запросе:
row_number() over(ORDER BY HIREDATE) as rank
никаких group by или order by
2. Во внешнем запросе:
WHERE rank... ORDER BY rank

IMHO могу ошибаться, не проверял

Разумеется, будет работать только в СУБД, которые поддерживают аналитические ф-ции
11 ноя 20, 11:38    [22230020]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
colacoca
Member

Откуда:
Сообщений: 8
Leonid Kudryavtsev, Изначально написал, что субд не поддерживает row_number()
11 ноя 20, 11:44    [22230023]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
colacoca
что субд не поддерживает row_number()


а как Вы собираетесь реализовывать "пронумеровать строки" ?

почему count() ? почему не min / max / sum / avg... и 100500 других слов английского языка ?

не говоря уже о банальных ошибках синтаксиса


Если Java, то ORDER BY HIREDATE и результат for'ами, for'ами. Для пагинации на стороне клиента ничего пронумеровывать не нужно.
11 ноя 20, 11:55    [22230028]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
colacoca
Member

Откуда:
Сообщений: 8
Leonid Kudryavtsev, У меня есть 2 шаблона из разных примеров

1) Как можно пронумеровать строки

select count (test_2.id_test) as rank, test_1.id_test, test_1.string
from test as test_1 inner join test as test_2 on
	test_1.id_test >= test_2.id_test
group by test_1.id_test, test_1.string
order by rank


2)Как реализовать пагинацию. Т.к. row_number мне не подходит я постарался соединить шаблон 1 со 2.

;WITH Results_CTE AS
(
    SELECT
        Col1, Col2, ...,
        ROW_NUMBER() OVER (ORDER BY SortCol1, SortCol2, ...) AS RowNum
    FROM Table
    WHERE <whatever>
)
SELECT *
FROM Results_CTE
WHERE RowNum >= @Offset
AND RowNum < @Offset + @Limit


Я постарался эти шаблоны применить к моему случаю, но не смог, поэтому попросил помощи

Сообщение было отредактировано: 11 ноя 20, 12:18
11 ноя 20, 12:19    [22230042]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
colacoca


1) Как можно пронумеровать строки

select count (test_2.id_test) as rank, test_1.id_test, test_1.string
from test as test_1 inner join test as test_2 on
	test_1.id_test >= test_2.id_test
group by test_1.id_test, test_1.string
order by rank


вот же есть извращенцы )))

но в данном примере:
1) считаются уникальные ID'шники идущие в базе данных после текущей записи.
HIREDATE на такое не тянет, нужен ID'шник или уникальная связка
2) нет ошибки синтаксиса в GROUP BY
В GROUP BY должны перечислять все поля, которые в запросе идут без агрегатной ф-ции
т.е. у Вас это:
test_1.ID, test_1.FIRSTNAME, test_1.LATNAME, test_1.MIDDLENAME, test_1.POSITION, test_1.MANAGER, test_1.HIREDATE, test_1.SALARY, test_1.DEPARTMENT

декартово произведение ради того, что бы пронумеровать строки.... ну не знаю.... лично у меня на такое даже воображения не хватает

Ну и если я правильно понимаю "замысел", то для не уникальных полей (типа HIREDATE) все равно никакой "пронумеровать строки" не получится. Могу ошибаться. Воображения не хватает.

Хотя, не спорю, что данную идею вполне можно развить на составной ключ или связку полей ( HIREDATE, ID ). Но мне кажется это академическая задача, ни имеющая никакой практической ценности.
11 ноя 20, 12:51    [22230066]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
colacoca

Я постарался эти шаблоны применить к моему случаю, но не смог


1) у "не смог", как минимум есть сообщение об ошибке

2) ну и "для странных" задач, желательно указывать отчего такие странные желания возникают. Если это студенческая задача ни имеющая практической ценности и преподавать-самодур, это одно. Если практическая - то совершенно другое.

Ну и к теме топика " pagination, java, jdbc, Generic sql " это никакого отношения не имеет. Т.к. в реальной жизни, пагинацию можно сделать 100500 других способов
11 ноя 20, 12:57    [22230073]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Сделал тестовые данные и запросы на практологическую нумерацию строк
особого смысла в этом не вижу
В целом, конечно, занятная методика повышения ВНП страны методом траты электричества на декартово произведение с целью пронумеровать строки )))

+

drop table tt_test;

create table tt_test ( id number primary key, s1 varchar2(10), s2 varchar2(10) );
insert into tt_test values ( 1, 's1', 's1_1' );
insert into tt_test values ( 2, 's1', 's1_2' );
insert into tt_test values ( 3, 's2', 's2_1' );
insert into tt_test values ( 4, 's1', 's1_3' );
insert into tt_test values ( 5, 's2', 's2_2' );
insert into tt_test values ( 6, 's3', 's3_1' );
insert into tt_test values ( 7, 's1', 's1_4' );

-- нормальный способ с помощью аналитики
select row_number() over (order by s1) r, t1.*
from tt_test t1
order by r;

-- по уникальному полю
-- (на oracle: sort merge join)
select count(1) as rank, t1.id, t1.s1, t1.s2 from tt_test t1, tt_test t2
where t1.id >= t2.id 
group by t1.id, t1.s1, t1.s2
order by rank;

-- по не уникальному полю, в принципе результат логичный
-- и даже осмысленный (ранк группы)
-- (на oracle: sort merge join)
select count(1) as rank, t1.id, t1.s1, t1.s2 from tt_test t1, tt_test t2
where t1.s1 >= t2.s1 
group by t1.id, t1.s1, t1.s2
order by rank, t1.id;

-- по двум полям (уникальная связка)
-- база плакала, индексы накрывались медным тазом
-- (на oracle: nested loops по full table scan)
select count(1) as rank, t1.id, t1.s1, t1.s2 from tt_test t1, tt_test t2
where t1.s1 > t2.s1  or ( t1.s1=t2.s1 and t1.id >= t2.id )
group by t1.id, t1.s1, t1.s2
order by rank;

-- Проктологическая пагинация
-- Страница 2 (по 3 записи на страницу)
WITH Results_CTE AS (
select count(1) as rank, t1.id, t1.s1, t1.s2 from tt_test t1, tt_test t2
where t1.s1 > t2.s1  or ( t1.s1=t2.s1 and t1.id >= t2.id )
group by t1.id, t1.s1, t1.s2
)
SELECT * FROM Results_CTE
WHERE rank >= 3 and rank < 6



Сообщение было отредактировано: 11 ноя 20, 15:30
11 ноя 20, 15:31    [22230189]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
colacoca
Member

Откуда:
Сообщений: 8
Leonid Kudryavtsev, Спасибо, попробую!
12 ноя 20, 18:45    [22231045]     Ответить | Цитировать Сообщить модератору
 Re: pagination, java, jdbc, Generic sql  [new]
mayton
Member

Откуда: loopback
Сообщений: 49768
Не забудьте про тот факт что БД - это разделяемый ресурс и пока вы делаете pagination,
таблица может изменится. И листинг следующей страницы может внезапно показать
либо часть строк предыдущей либо потерять часть строк которые "отъехали" назад из за удалений.

Вобщем я редко встречал грамотно реализованную pagination на изоляции сессий.

P.S. Если дойдете до Pagination конешно.
12 ноя 20, 19:07    [22231056]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить