On Wed, Dec 15, 2010 at 03:56:06AM -0600, Nicolas Williams wrote:
> SELECT * FROM toy
> WHERE
> a >= (SELECT a FROM toy WHERE id = 6) OR
> (a = (SELECT a FROM toy WHERE id = 6) AND
> b <= (SELECT b FROM toy WHERE id = 6)) OR
> (a = (SELECT a FROM toy WHERE id = 6) AND
> b = (SELECT b FROM toy WHERE id = 6) AND
> c >= (SELECT c FROM toy WHERE id = 6))
> ORDER BY a ASC, b DESC, c ASC LIMIT 1 OFFSET 1;
Oh, and drop the = from the >= and <= tests and you can drop the OFFSET
1 part. Same for the other one. So you get:
SELECT * FROM toy
WHERE
a > (SELECT a FROM toy WHERE id = 6) OR
(a = (SELECT a FROM toy WHERE id = 6) AND
b < (SELECT b FROM toy WHERE id = 6)) OR
(a = (SELECT a FROM toy WHERE id = 6) AND
b = (SELECT b FROM toy WHERE id = 6) AND
c > (SELECT c FROM toy WHERE id = 6))
ORDER BY a ASC, b DESC, c ASC LIMIT 1;
And:
SELECT * FROM toy
WHERE
a < (SELECT a FROM toy WHERE id = 6) OR
(a = (SELECT a FROM toy WHERE id = 6) AND
b > (SELECT b FROM toy WHERE id = 6)) OR
(a = (SELECT a FROM toy WHERE id = 6) AND
b = (SELECT b FROM toy WHERE id = 6) AND
c < (SELECT c FROM toy WHERE id = 6))
ORDER BY a DESC, b ASC, c DESC LIMIT 1;
Both have the same efficient query plan. Drop the index and you'll see
that you get full table scans.
Nico
--
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users