Kieth,

Thanks for the reply.  I should have asked sooner and would have wasted less 
time trying to 
do something sqlite wasn't meant for.  I will however look up rolling cursors.  
That may help 
a little.  Again, thanks.

Mark


On Wednesday, September 17, 2014 11:14:36 PM Keith Medcalf wrote:
> You cannot do any of these things in any relational database.  You can only
> do this in navigational databases.  There are various kludges which permit
> you to simulate navigational abilities on top of relational databases, but
> they are all kludges which are performed by various forms of fakery to
> impose navigability on top of a model which inherently is not navigable.
> 
> For example, many database drivers can kludge you up what is called a
> "keyset" driven cursor.  It does this by executing the query and storing a
> temporary table containing the primary keys of each table in the query for
> each result row (this is stored either in the driver (for a client-driven
> keyset) or on the server (for a server driven keyset).  When you ask for a
> row from the keyset, the primary keys are used to issue a bunch of queries
> to "reconstruct" the "present view" of the result that would be at that
> navigational location for you.  There are also, usually in these same
> drivers, what are called "scrollable" cursors.  These differ from a
> "keyset" cursor in that the query result set is stored in a temporary table
> (rather than a keyset table).  The driver can then "pretend" there is
> ordering and record numbers on the results and can internally reissue
> queries against the temporary table and its row numbers so that it appears
> you can scroll forwards and backwards and access rand om rows of the result
> set (this type of cursor is almost always implemented on the server as a
> temp table and the only information sent to the client are the extents of
> the rowset).  The key difference is that keyset cursors can be used to
> update the database (since you have the primary keys for the original data
> rows stored away) whereas plain scrollable cursors are read only.
> 
> In some systems these types of capabilities exist solely in the drivers.  In
> others, there is inherent support in the database engine itself.  There are
> even cases where there is a combination of both, or where you can select
> whether the support should be implemented server-side or client-side.  In
> some cases the choice of implementation method is taken away from you in
> order to protect you from doing something "abysmal", such as retrieving the
> primary keys for a billion row keyset into driver storage.)
> 
> This is a kludge to give the appearance of navigational capabilities where
> they inherently do not exist.
> 
> The other way to do it is the way primitive folks do it -- retrieve the
> entire result set into a big list of records in your programs storage, and
> then navigate through your list in memory.  This is popular with Microsoft
> tools, for example, and is why most Microsoft tools take aeons to open (try
> to open the event viewer on a busy Microsoft server, or open DSA against a
> domain with a several hundred thousand objects.  You come in to work and
> sign on, then open the tool and lock the screen, then go for breakfast, and
> meetings, and lunch.  When you return after lunch the tool is ready to use.
>  Or it has crashed because it ran out of memory.)
> 
> It is also quite common for "bitty system" developers to do this. 
> Everything works swimmingly well on their test database with 5 customers
> and 3 products.  However, once the "production" database is loaded that
> contains a few thousand customers and several millions of products and
> components, the system craps out or is abysmally slow.  You then read
> stories in the newspaper about how some company (or government) spent
> hundreds of millions or billions of dollars on a failed computer system.
> 
> There are still other products which do not provide drivers which kludge up
> any of these illusions for you, and the database engine does not have the
> baked in complication to assist with the creation of these illusions.  For
> these systems you have to do all the skull-duggery yourself.  SQLite falls
> into this category.  I don't think anyone was written a "driver" which
> implements this in automated fashion either, so you have to "roll your own"
> as it were.
> >I'm racking my brain trying to figure out how to get directly to the last
> >item in a (potentially) sorted or ordered table.  At least oe of the
> >tables will be ordered by a name and a date, so uising the rtowid won't
> >work.
> Read all the results until you run out of results.  At this point the last
> result you successfully retrieved was the last.  If this takes too long
> then,
> >Also, how to traverse a table or cursor in a reverse direction.
> 
> Issue the same query again, and "reverse" the sort order of each column in
> the group by clause.  You will now retrieve the result set in the opposite
> order and the "first" row will be the "last" and the "last" shall be
> "first".  If you wish to start "in the middle" devise some constraints to
> add (to the where clause) which determine the appropriate slicing of the
> result set.
> >Going from first to last is easy in pysqlite, just use fetchone().
> >Geting directly to the first record is also easy, just open the
> >desired table and the first fetch is the first record.
> 
> No, the first fetch returns the first row of the result set.  If and only if
> you issued a query with an order by clause giving a specific fully
> determined ordering to the results is ordering guaranteed.  It is the order
> by clause which determines the order.  If you do not have an order by
> clause in the query, then the row that you are calling the "first" row is
> only that by happenstance and the gyrational flux of subatomic particles at
> the time of the observation.  Be aware, however, that like Schroedingers
> Cat, your observation of the subatomic gyrations will fix the duality in a
> random fashion that may be different for each observation.
> >But, if I'm, for example,  at the 10th record of an ordered table
> >(cursor), how do I go backward one or more times?
> 
> Issue an appropriate query to generate a result set containing the set of
> result rows that you want in the order that you desire, and retrieve them.
> >And how do I go directly to the last?
> 
> Re-issue the query with the order by clause inverted (change ASC to DESC and
> DESC to ASC for every item in the order by clause).  Now when you retrieve
> the "first" row you will get what was the "last" when ordered in the
> opposite direction, and the "last" will now be "first".
> 
> Set theory, relational algebra, and the higher mathematics on which
> relational databases are built is both extremely complex and amazingly
> simple all at the same time.  The first thing you have to do is realize
> that there is no such thing as "order".  If you want "order", you must ask
> for it explicitly.  Relying on happenstance is not a substitute and is
> unwise.  Also, the row-by-row access wherein you think you are "stepping
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to