この質問と同じことをしようとしていますが、今回は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);