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