SQL запрос на разбиение на страницы с несколькими столбцами; понять оператор ИЛИ - PullRequest
0 голосов
/ 27 февраля 2020

Я использую инструмент, который генерирует запрос Postgresql ниже:

SELECT
    "id",
    "score"
FROM
    "players"
WHERE
    "score" > '11266' OR ( "score" = '11266' AND "id" > '4482' )
ORDER BY
    "score" ASC,
    "id" ASC
    LIMIT 3

Мне нужно понять, почему оператор OR?

Мои игроков * Таблица 1008 * может иметь много строк с одинаковым score, но не одинаковым id.

Требуется ли OR, если несколько строк имеют одинаковое значение score?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2020

Цель OR - как вы подозреваете - состоит в том, чтобы обработать случай, когда в оценках есть связи. Идея состоит в том, чтобы сделать стабильную сортировку, включив id, поэтому получим все после (score, id).

Предположительно, значения, используемые для score и id последние значения (вероятно, на предыдущей странице, но это предположение).

Стабильная сортировка - это сортировка, возвращающая строки в том же порядке каждый раз, когда она применяется. Поскольку SQL таблицы представляют неупорядоченные наборы, связи подразумевают unstable sort. Включение id делает его стабильным (при условии, что id уникален.

Postgres на самом деле поддерживает более простой синтаксис:

where (score, id) > (11266, 4482)

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

0 голосов
/ 27 февраля 2020

SELECT  *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
          FROM      Orders
          WHERE     OrderDate >= '1980-01-01'
        ) AS RowConstrainedResult
WHERE   RowNum >= 1
    AND RowNum < 20
ORDER BY RowNum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...