Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / pagination, java, jdbc, Generic sql / 13 сообщений из 13, страница 1 из 1
11.11.2020, 01:17
    #40017001
colacoca
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
Нужно реализовать сортировку по дате принятия на работу(hiredate(типа DATE)), не используя limit, offset, top, rownumber()
Я попытался пронумеровать строки и, отталкиваясь от этого сделать выборку. Помогите, пожалуйста, найти ошибки. Так как я понимаю, что решение далеко неправильное. Или же может быть предложите своё решение:)

Код: sql
1.
2.
3.
4.
5.
6.
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 < ?
...
Рейтинг: 0 / 0
11.11.2020, 06:24
    #40017013
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
colacoca,

При чём тут Java? :-)
...
Рейтинг: 0 / 0
11.11.2020, 09:40
    #40017032
colacoca
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
mad_nazgul, Вопрос изначально был в другом формате, я его отредактировал и забыл выбрать другую тему. В любому случае вопрос относится к JDBC, т.к. вместо "?" надо поставить условие пагинации.
...
Рейтинг: 0 / 0
11.11.2020, 10:11
    #40017040
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
colacoca,
Нет. Идите в форум бд и сделайте рабочий запрос.
Потом тут просто подставите вопросики где надо.
...
Рейтинг: 0 / 0
11.11.2020, 11:38
    #40017075
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
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 могу ошибаться, не проверял

Разумеется, будет работать только в СУБД, которые поддерживают аналитические ф-ции
...
Рейтинг: 0 / 0
11.11.2020, 11:44
    #40017078
colacoca
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
Leonid Kudryavtsev, Изначально написал, что субд не поддерживает row_number()
...
Рейтинг: 0 / 0
11.11.2020, 11:55
    #40017082
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
colacoca
что субд не поддерживает row_number()


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

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

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


Если Java, то ORDER BY HIREDATE и результат for'ами, for'ами. Для пагинации на стороне клиента ничего пронумеровывать не нужно.
...
Рейтинг: 0 / 0
11.11.2020, 12:19
    #40017092
colacoca
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
Leonid Kudryavtsev, У меня есть 2 шаблона из разных примеров

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

Код: sql
1.
2.
3.
4.
5.
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.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
;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



Я постарался эти шаблоны применить к моему случаю, но не смог, поэтому попросил помощи
...
Рейтинг: 0 / 0
11.11.2020, 12:51
    #40017106
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
colacoca


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

Код: sql
1.
2.
3.
4.
5.
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 ). Но мне кажется это академическая задача, ни имеющая никакой практической ценности.
...
Рейтинг: 0 / 0
11.11.2020, 12:57
    #40017112
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
colacoca

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


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

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

Ну и к теме топика " pagination, java, jdbc, Generic sql " это никакого отношения не имеет. Т.к. в реальной жизни, пагинацию можно сделать 100500 других способов
...
Рейтинг: 0 / 0
11.11.2020, 15:31
    #40017202
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
Сделал тестовые данные и запросы на практологическую нумерацию строк
особого смысла в этом не вижу
В целом, конечно, занятная методика повышения ВНП страны методом траты электричества на декартово произведение с целью пронумеровать строки )))


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
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


...
Рейтинг: 0 / 0
12.11.2020, 18:45
    #40017675
colacoca
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
Leonid Kudryavtsev, Спасибо, попробую!
...
Рейтинг: 0 / 0
12.11.2020, 19:07
    #40017685
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
pagination, java, jdbc, Generic sql
Не забудьте про тот факт что БД - это разделяемый ресурс и пока вы делаете pagination,
таблица может изменится. И листинг следующей страницы может внезапно показать
либо часть строк предыдущей либо потерять часть строк которые "отъехали" назад из за удалений.

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

P.S. Если дойдете до Pagination конешно.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / pagination, java, jdbc, Generic sql / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]