The "main" database is always seq == 0, the "temp" database is always seq == 1, and other databases are seq == 2 and greater in the order they were attached. seq 2 -> whatever is always contiguous. The table search order for unqualified names (when a search is required) is always in the seq returned by pragma database_list, so
select name from pragma_database_list as d where exists (select * from pragma_table_info where schema == d.name and arg == 'x') limit 1; will always return the correct schema name, no order by required. (and you can use table_info rather than table_xinfo because a table must always have one named column that is not hidden. If this were not the case, then you would have to use table_xinfo to ensure that something is returned for that pragma lookup. SQLite version 3.31.0 2020-01-20 03:22:36 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> attach database ':memory:' as two; sqlite> attach database ':memory:' as three; sqlite> attach database ':memory:' as four; sqlite> attach database ':memory:' as five; sqlite> create table main.x(x); sqlite> insert into main.x values (0); sqlite> create table temp.x(x); sqlite> insert into temp.x values (1); sqlite> create table two.x(x); sqlite> insert into two.x values (2); sqlite> create table three.x(x); sqlite> insert into three.x values (3); sqlite> create table four.x(x); sqlite> insert into four.x values (4); sqlite> create table five.x(x); sqlite> insert into five.x values (5); sqlite> pragma database_list; 0|main| 1|temp| 2|two| 3|three| 4|four| 5|five| sqlite> detach database three; sqlite> pragma database_list; 0|main| 1|temp| 2|two| 3|four| 4|five| sqlite> select * from x; 1 sqlite> select name ...> from pragma_database_list as d ...> where exists (select * ...> from pragma_table_xinfo ...> where schema == d.name ...> and arg == 'x') ...> limit 1; main sqlite> drop table main.x; sqlite> select * from x; 1 sqlite> select name ...> from pragma_database_list as d ...> where exists (select * ...> from pragma_table_xinfo ...> where schema == d.name ...> and arg == 'x') ...> limit 1; temp sqlite> drop table four.x; sqlite> select * from x; 1 sqlite> select name ...> from pragma_database_list as d ...> where exists (select * ...> from pragma_table_xinfo ...> where schema == d.name ...> and arg == 'x') ...> limit 1; temp sqlite> drop table temp.x; sqlite> select * from x; 2 sqlite> select name ...> from pragma_database_list as d ...> where exists (select * ...> from pragma_table_xinfo ...> where schema == d.name ...> and arg == 'x') ...> limit 1; two sqlite> create table temp.x(x); sqlite> insert into temp.x values (1); sqlite> select * from x; 1 sqlite> select name ...> from pragma_database_list as d ...> where exists (select * ...> from pragma_table_xinfo ...> where schema == d.name ...> and arg == 'x') ...> limit 1; temp sqlite> -- The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume. >-----Original Message----- >From: sqlite-users <sqlite-users-boun...@mailinglists.sqlite.org> On >Behalf Of x >Sent: Monday, 20 January, 2020 01:27 >To: SQLite mailing list <sqlite-users@mailinglists.sqlite.org> >Subject: Re: [sqlite] Find schema of a table in a query > >WOW Keith. That’s the sqlite coding equivalent of scoring a hat trick in >the world cup final. I’ve added an order by to get the solution > >select name from pragma_database_list d >where (select name from pragma_table_xinfo where schema==d.name and >arg==?1) >order by seq!=1, seq limit 1; > >I’m assuming the temp db is always 1 in the seq column. Can anyone >confirm that or should I change it to > >order by lower(name)!=temp, seq limit 1; > >Thanks. I also learned the parentheses are not required for pragma >functions when there’s no params and alternate syntax when they are. > > >________________________________ >From: sqlite-users <sqlite-users-boun...@mailinglists.sqlite.org> on >behalf of Keith Medcalf <kmedc...@dessus.com> >Sent: Sunday, January 19, 2020 8:32:06 PM >To: SQLite mailing list <sqlite-users@mailinglists.sqlite.org> >Subject: Re: [sqlite] Find schema of a table in a query > > >On Sunday, 19 January, 2020 01:47, x <tam118...@hotmail.com> wrote: > >>Suppose you’re given a query ‘SELECT 1 from tbl’ by a user and you want >>to know the name of the schema that tbl belongs to. What’s the easiest >>way to do this? > >>I know sqlite will use temp.tbl if it exists else main.tbl if it exists >>else it will search for the earliest attached schema with a table called >>tbl. Finding that involves the use of PRAGMA database_list and then >>querying each of the associated sqlite_master tables in turn for the >>existence of tbl until you get a match. Is there an easier way? > >How about: > >select name > from pragma_database_list as d > where (select name > from pragma_table_xinfo > where schema == d.name > and arg == 'x') is not null; > >Where you set "arg == 'tablename'" which will return all the schema's in >which the specified tablename exists. > >-- >The fact that there's a Highway to Hell but only a Stairway to Heaven >says a lot about anticipated traffic volume. > > > >_______________________________________________ >sqlite-users mailing list >sqlite-users@mailinglists.sqlite.org >http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >_______________________________________________ >sqlite-users mailing list >sqlite-users@mailinglists.sqlite.org >http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users