Пытаюсь сделать то же самое, что и этот вопрос, но на этот раз в 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);