Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Получение записи по курсору / 6 сообщений из 6, страница 1 из 1
29.12.2019, 15:46
    #39909596
polin11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение записи по курсору
СУБД Postgresql есть таблица с городами и странами.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE T (
  id INTEGER,
  town_country VARCHAR (255),
  is_country bool
) ;--DEFAULT CHARSET=utf8 ;

INSERT INTO T
  (id, town_country, is_country)
VALUES
  (1, 'Франция', true),
  (2, 'Германия', true),
  (4, 'Россия',  true),
  (5, 'Канада', true),
  (6, 'Бельгия',  true),
  (7, 'Беларусь', true),
  (8, 'Австралия', true),
  (9, 'Япония', true),
  (10, 'Афины', null),
  (11, 'Брюссель', null),
  (12, 'Барселона', null)



Отсортированный список
Код: sql
1.
2.
3.
4.
5.
SELECT *
FROM T
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST



Австралия
Беларусь
Бельгия
Германия
Канада
Россия
Франция
Япония
Афины
Брюссель
Барселона

Нужно написать несколько запросов, которые возвращают по 5 записей из этого списка.
Начиная со 2 запроса, нужно в условие запроса передать
последнюю запись, найденную в предыдущем запросе.

Первый запрос без условия:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT *
FROM T
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
LIMIT 5


Получаем набор, все ОК:
Австралия
Беларусь
Бельгия
Германия
Канада
https://www.db-fiddle.com/f/SpTXQTSprkMr3syfk6DSE/0


Берем последнюю запись - Канада, нужно получить следующие 5 записей, которые
находятся в списке под Канадой, например так:
Второй запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT *
FROM T
where town_country > 'Канада'
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
 LIMIT 5


https://www.db-fiddle.com/f/39cbZdNmr4HzVzsS1mnfxy/0

Проблема: возвращается только 3 записи (Россия, Франция, Япония), из-за использования сортировки
is_country DESC NULLS LAST

Третим запросом нужно вернуть одну запись:
Барселона

Как правильно написать 2 и 3 запросы, во второй запрос нужно передать последнюю запись из 1 запроса,
в 3 запрос нужно передать последнюю запись из 2 запроса?
...
Рейтинг: 0 / 0
29.12.2019, 21:55
    #39909670
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение записи по курсору
Интересно, мне одному хочется спросить:
Казалось бы, при чем здесь Лужков курсор ? :)
...
Рейтинг: 0 / 0
29.12.2019, 23:14
    #39909676
polin11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение записи по курсору
Troglodit,

Попробую понятней описать проблему:

1) При первом вызове метода не передают параметр - курсор, метод возвращает 5 записей:
Австралия
Беларусь
Бельгия
Германия
Канада

2) При следующем вызове метода передают последнюю запись - курсор из пред. вызова (Канада), мне нужно вернуть следующие 5 записей из списка, находящиеся под курсором. Я не знаю второй это вызов, третий или четвертый. У меня просто есть запись - курсор (последняя запись из пред. вызова)

Вопрос как написать такие запросы, чтобы по частям вернуть весь список в нужной сортировке (сначала страны, потом города)?
...
Рейтинг: 0 / 0
30.12.2019, 10:02
    #39909740
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение записи по курсору
polin11,

кто на ком стоял
какой курсор, куда он пошёл


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT *
FROM T
where (case when is_country  then 0 else 1 END
,town_country ) >(0 , 'Канада') -- см сравнение  rows
       
ORDER BY
case when is_country then 0 else 1 END
 ,town_country ASC NULLS FIRST
 LIMIT 5
...
Рейтинг: 0 / 0
30.12.2019, 13:26
    #39909828
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение записи по курсору
qwwq,

Я пока даже не пытаюсь, что то сделать, т.к. вообще не понимаю постановки задачи.
Нужно написать несколько запросов, которые возвращают по 5 записей из этого списка.
Может какой то рекурсивный cte нужен, но пока все в тумане, хрустальный шар разбит в клочья.
...
Рейтинг: 0 / 0
04.01.2020, 23:47
    #39910842
Victor Nevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение записи по курсору
Запросто :)
Код: plaintext
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
# CREATE TABLE T (
#   id INTEGER,
#   town_country VARCHAR (255),
#   is_country bool
# ) ;--DEFAULT CHARSET=utf8 ;
CREATE TABLE
# 
# 
# 
# 
# INSERT INTO T
#   (id, town_country, is_country)
# VALUES
#   (1, 'Франция', true),
#   (2, 'Германия', true),
#   (4, 'Россия',  true),
#   (5, 'Канада', true),
#   (6, 'Бельгия',  true),
#   (7, 'Беларусь', true),
#   (8, 'Австралия', true),
#   (9, 'Япония', true),
#   (10, 'Афины', null),
#   (11, 'Брюссель', null),
#   (12, 'Барселона', null);
INSERT 0 11
# 
# 
# DECLARE cr_t SCROLL CURSOR WITH HOLD FOR (SELECT *
#                                             FROM T
#                                            ORDER BY is_country DESC NULLS LAST, 
#                                                     town_country ASC NULLS FIRST);
DECLARE CURSOR
# 
# 
# FETCH FORWARD 5 FROM cr_t;
 id | town_country | is_country 
----+--------------+------------
  8 | Австралия    | t
  7 | Беларусь     | t
  6 | Бельгия      | t
  2 | Германия     | t
  5 | Канада       | t
(5 rows)

# FETCH FORWARD 5 FROM cr_t;
 id | town_country | is_country 
----+--------------+------------
  4 | Россия       | t
  1 | Франция      | t
  9 | Япония       | t
 10 | Афины        | 
 12 | Барселона    | 
(5 rows)

# FETCH FORWARD 5 FROM cr_t;
 id | town_country | is_country 
----+--------------+------------
 11 | Брюссель     | 
(1 row)

# CLOSE cr_t;
CLOSE CURSOR
# 
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Получение записи по курсору / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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