select a.name, a.assignedTo, a.validFrom
from aliases a,
(select name, max(validfrom) as mvf
from aliases,
(select strftime('%s', 'now') as now) as c
where validFrom <= now
group by name) as b
where a.name=b.name and a.validfrom=b.mvf;
should also work. I changed the syntax slightly:
from a join b join c on a.x=b.y and b.z=c.p is just a different spelling of
from a, b, c where a.x=b.y and b.z=c.p
designed to make it clear (COBOL style) which clauses are join columns (ON) and
which are row selectors (WHERE). It should have zero effect on the actually
query plan.
Effectively, creates a temp table with a single row containing a single value
now, which is used as a selector against the rows of aliases. This format
should guarantee that the strftime function is only ever executed once.
sqlite> explain query plan select a.name, a.assignedTo, a.validFrom
...> from aliases a,
...> (select name, max(validfrom) as mvf
...> from aliases,
...> (select strftime('%s', 'now') as now) as c
...> where validFrom <= now
...> group by name) as b
...> where a.name=b.name and a.validfrom=b.mvf;
SELECT item[0] = {0:0}
item[1] = {0:1}
item[2] = {0:2}
FROM {0,*} = aliases (AS a)
{1,*} = SELECT agg_flag
item[0] = AGG{2:0}
item[1] = AGG_FUNCTION:max(AGG{2:2})
FROM {2,*} = aliases
{3,*} = SELECT FUNCTION:strftime(item[0] = '%s'
item[1] = 'now')
END (tabname=sqlite_subquery_53E850_) (AS c)
WHERE LE({2:2},{3:0})
GROUPBY {2:0}
END (tabname=sqlite_subquery_53E4D0_) (AS b)
WHERE AND(EQ({0:0},{1:0}),EQ({0:2},{1:1}))
END
sele order from deta
---- ------------- ---- ----
1 0 1 SCAN SUBQUERY 2 AS c (~1 rows)
1 1 0 SCAN TABLE aliases (~333333 rows)
1 0 0 USE TEMP B-TREE FOR GROUP BY
0 0 1 SCAN SUBQUERY 1 AS b (~100 rows)
0 1 0 SEARCH TABLE aliases AS a USING AUTOMATIC COVERING
INDEX (name=? AND validFrom=?) (~7 rows)
sqlite>
---
() ascii ribbon campaign against html e-mail
/\ www.asciiribbon.org
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users