powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / pagination, java, jdbc, Generic sql
13 сообщений из 13, страница 1 из 1
pagination, java, jdbc, Generic sql
    #40017001
colacoca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно реализовать сортировку по дате принятия на работу(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
pagination, java, jdbc, Generic sql
    #40017013
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
colacoca,

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


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

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

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


Если Java, то ORDER BY HIREDATE и результат for'ами, for'ами. Для пагинации на стороне клиента ничего пронумеровывать не нужно.
...
Рейтинг: 0 / 0
pagination, java, jdbc, Generic sql
    #40017092
colacoca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
pagination, java, jdbc, Generic sql
    #40017106
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
pagination, java, jdbc, Generic sql
    #40017112
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
colacoca

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


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

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

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


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

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

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


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