sqlite tuple comparison

Пытаюсь сделать то же самое, что и этот вопрос, но на этот раз в sqlite. В моем текущем приложении мне нужно иметь возможность выполнить такой запрос:

SELECT First, Last, Score
FROM mytable
WHERE
    ('John',  'Jordan',  5) <= (First, Last, Score )
    AND (First, Last, Score) <= ('Mike',  'Taylor',  50) 
ORDER BY First, Last, Score
LIMIT 1

и получить ответ ('Liz', 'Jordan', 2), учитывая эти данные:

+-------+---------+-------+
| First | Last    | Score |
+-------+---------+-------+
| Liz   | Jordan  |     2 |
| John  | Jordan  |     2 |
| Liz   | Lemon   |    10 |
| Mike  | Taylor  |   100 |
| John  | Jackson |  1000 |
| Mike  | Wayne   |     1 |
| Liz   | Lemon   |    20 |
| Liz   | Meyers  |     5 |
| Bruce | Jackson |     1 |
+-------+---------+-------+

Какой наиболее эффективный способ выполнить это в sqlite? Пожалуйста, имейте в виду, что это игрушечный пример, и что мое реальное приложение имеет таблицы с большим количеством столбцов и типов данных, и сотни миллионов строк.

Если решение легко расширяется на большее/меньшее количество столбцов, это еще лучше.


Сравнение кортежей:

Кортежи упорядочиваются лексикографически, то есть последовательности упорядочиваются так же, как их первые различающиеся элементы. Например, (1,2,x) < (1,2,y) возвращает то же самое, что x < y.

Стоит отметить, что SQL-92 (и mysql, oracle, postresql) реализует это правильно. Стандарт использует "конструктор значения строки" для обозначения того, что я называю кортежем. Поведение определено в мучительных подробностях в части 8.2.7, страница 209.


Вот необходимый SQL для создания примера:

create table mytable ( First char(20), Last char(20), Score int );
insert into mytable values ('Liz', 'Jordan', 2);
insert into mytable values ('John', 'Jordan', 2);
insert into mytable values ('Liz', 'Lemon', 10);
insert into mytable values ('Mike', 'Taylor', 100);
insert into mytable values ('John', 'Jackson', 1000);
insert into mytable values ('Mike', 'Wayne', 1);
insert into mytable values ('Liz', 'Lemon', 20);
insert into mytable values ('Liz', 'Meyers', 5);
insert into mytable values ('Bruce', 'Jackson', 1);
create unique index 'UNIQ' on mytable (First, Last, Score);
6
задан Community 23 May 2017 в 11:51
поделиться