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
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to