试图做同样的事情this question,但这次在sqlite中。在我目前的应用程序中,我需要能够做这种类型的查询: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)正确地实现了这一点。该标准使用“行值构造函数”来表示我调用的元组。该行为在part 8.2.7, page 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);
我不知道是否mysql优化器足够聪明,知道这与元组语法相同。 – bukzor 2011-04-27 05:38:03
@ bukzor:对。我会纠正我的答案。 – 2011-04-27 11:51:20