There is a related issue:

If you use this valid efficient query ,

SELECT id,data FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2)
WHERE id=10 ORDER BY data;

as a subquery of SELECT id FROM (...), i.e.,

SELECT id FROM (SELECT id,data FROM (SELECT * FROM t1 UNION ALL SELECT
* FROM t2) WHERE id=10 ORDER BY data);

SQLite reports error:
Error: 1st ORDER BY term out of range - should be between 1 and 1

Thanks,
Yuanzhong

On Sat, Sep 20, 2014 at 5:36 AM, Dan Kennedy <danielk1...@gmail.com> wrote:
> On 09/20/2014 10:59 AM, Yuanzhong Xu wrote:
>>
>> I think this is related to a check for restriction (18) in subquery
>> flattening.
>>
>> (18) If the sub-query is a compound select, then all terms of the
>> ORDER by clause of the parent must be simple references to
>> columns of the sub-query.
>
>
> Quite correct. Internally, SQLite 'flattens' the first query to:
>
>    SELECT id, data FROM t1 WHERE id=10
>      UNION ALL
>    SELECT id, data FROM t2 WHERE id=10
>    ORDER BY data
>
> Which can be executed efficiently. But it does not currently do the same
> trick for the second, as:
>
>    SELECT id FROM t1 WHERE id=10
>      UNION ALL
>    SELECT id FROM t2 WHERE id=10
>    ORDER BY data
>
> is not a valid statement in SQLite.
>
> Dan.
>
>
>
>>
>> Thanks,
>> Yuanzhong
>>
>> On Fri, Sep 19, 2014 at 8:16 PM, Yuanzhong Xu <y...@utexas.edu> wrote:
>>>
>>> Hi,
>>>
>>> In SQLite 3.8.6, suppose I have two tables in the same format:
>>>
>>> CREATE TABLE t1 (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT);
>>> CREATE TABLE t2 (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT);
>>>
>>>
>>> The query plan can be quite efficient for:
>>>
>>> EXPLAIN QUERY PLAN SELECT id,data FROM (SELECT * FROM t1 UNION ALL
>>> SELECT * FROM t2) WHERE id=10 ORDER BY data;
>>>
>>> 1|0|0|SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?)
>>> 2|0|0|SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?)
>>> 0|0|0|COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)
>>>
>>> However, if you remove "data" column from the outer SELECT, it becomes
>>> very inefficient:
>>>
>>> EXPLAIN QUERY PLAN SELECT id FROM (SELECT * FROM t1 UNION ALL SELECT *
>>> FROM t2) WHERE id=10 ORDER BY data;
>>>
>>> 2|0|0|SCAN TABLE t1
>>> 3|0|0|SCAN TABLE t2
>>> 1|0|0|COMPOUND SUBQUERIES 2 AND 3 (UNION ALL)
>>> 0|0|0|SCAN SUBQUERY 1
>>> 0|0|0|USE TEMP B-TREE FOR ORDER BY
>>>
>>>
>>> Thanks,
>>> --
>>> Yuanzhong Xu
>>> Ph.D. Student
>>> Department of Computer Science
>>> the University of Texas at Austin
>>
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@sqlite.org
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to