On Thu, Aug 15, 2019 at 7:13 PM Keith Medcalf <kmedc...@dessus.com> wrote:
> > With long names turned on the columns are named differently when returned > though the aliased subquery. Since a dot (.) is the separator between the > schema.table or table.column and the column name contains an embedded dot, > you have to quote the name ... This is probably why long_column_names was > deprecated. > > select count(*)count,* from ( select count(*)count,* from addresses join > users on users.address_id=addresses.id ) address join pets pet on > pet.user_id=address.'users.id'; > > Row(count=1, address_count=1, address_addresses_id=1, > address_addresses_name='there', address_users_id=1, > address_users_address_id=1, address_users_name='bob', pet_id=1, > pet_user_id=1, pet_name='odif') > > select count(*)count,* from ( select count(*)count,* from addresses join > users on users.address_id=addresses.id ) address join pets pet on > pet.user_id=address.[users.id]; > > Row(count=1, address_count=1, address_addresses_id=1, > address_addresses_name='there', address_users_id=1, > address_users_address_id=1, address_users_name='bob', pet_id=1, > pet_user_id=1, pet_name='odif') > > select count(*)count,* from ( select count(*)count,* from addresses join > users on users.address_id=addresses.id ) address join pets pet on > pet.user_id=address."users.id"; > > Row(count=1, address_count=1, address_addresses_id=1, > address_addresses_name='there', address_users_id=1, > address_users_address_id=1, address_users_name='bob', pet_id=1, > pet_user_id=1, pet_name='odif') > > None of this removes the desire to get the alias of tables specified in queries. Even though queries eventually end up flat and column-aliased in the end, during development, it's still nice to get structured records from the database; and pragma long_column_names(whatever) changes the query behavior, so that's not an option to use without breaking old stuff. > -- > 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 [mailto:sqlite-users- > >boun...@mailinglists.sqlite.org] On Behalf Of J Decker > >Sent: Thursday, 15 August, 2019 19:19 > >To: SQLite mailing list > >Subject: Re: [sqlite] Request to get alias of table > > > >On Thu, Aug 15, 2019 at 4:52 PM Keith Medcalf <kmedc...@dessus.com> > >wrote: > > > >> > >> The query does not work because it is defective. The column name > >pragma's > >> only affect the column names that your program sees, not the names > >used > >> internally in the SQL statement. It does not affect the identifier > >use > >> internally. If your internal identifier use is defective, then it > >is > >> defective and only fixing the defect will fix it. In this > >particular case > >> it can ONLY be fixed by specifying appropriate column names using > >AS. > >> > >> pragma full_column_names=1; > >pragma short_column_names=0; > >does change how SQL deals with it. > > > >Without this query works > >select count(*)count,* from ( select count(*)count,* from addresses > >join > >users on users.address_id=addresses.id ) address join pets pet on > >pet.user_id=address.'id:1'; > > > >and with, it doesn't seem to be able to be referenced... you're > >right, I > >did end up making it a string isntead of a colum name, quoting with > >`` > >didn't work either. > > > > > > > >> In other words DO NOT use * unless you are absolutely certain that > >the > >> column names are unique. This is not a "personal peeve", this is > >how SQL > >> works. Do not use *. Period. End of story. This is almost > >always one of > >> the very first things one learns when using SQL. This is because > >if > >> something gets changed then the meaning of * gets changed. If the > >query > >> optimizer decides to do things differently (in a different order), > >the > >> results will be different. > >> > >> Using * means that you are relying on happenstance rather than > >actually > >> writing what you mean. > >> > >> select * from ( select count(*)count,* from addresses join users > >> on users.address_id=addresses.id ) address join pets pet on > >pet.user_id= > >> address.users.id; > >> > >> The subquery "select count(*) count,* from addresses join users on > >> users.address_id=addresses.id" has duplicated column names, and > >there is > >> nothing that you can do about this except use AS to give specific > >distinct > >> names to the columns. You then alias this as a tableform entity > >called > >> address. There are two id columns in address, and there is no way > >that you > >> can specify in the outer query which one you want other than by > >giving them > >> unique names in the inner query by listing explicit columns and > >giving them > >> unique aliases using AS. > >> > >> Like I said, if you care about column names then give the columns > >names, > >> and if you need to distinguish between two columns with the same > >name, give > >> them different aliases. > >> > > > >they already have different aliases, based on where they come from. > >For > >instance the long name option knows that count is not duplicated. > >The query has lots of structure that keeps duplicated values > >separate... > > > > { > > count: 1, > > 'address.count': 1, > > 'address.addresses.id': 1, > > 'address.addresses.name': 'there', > > 'address.users.id': 1, > > 'address.users.address_id': 1, > > 'address.users.name': 'bob' > > } > > > > > > > >> > >> -- > >> 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 [mailto:sqlite-users- > >> >boun...@mailinglists.sqlite.org] On Behalf Of J Decker > >> >Sent: Thursday, 15 August, 2019 14:37 > >> >To: SQLite mailing list > >> >Subject: Re: [sqlite] Request to get alias of table > >> > > >> >> > >> >> > >> >> > >> >> sqlite> select * from ( select count(*)count,* from addresses > >join > >> >users > >> >> on users.address_id=addresses.id ) address join pets pet on > >> >pet.user_id= > >> >> address.users.id; > >> >> Error: no such column: address.users.id > >> >> > >> >> > >> >>> console.log( db.do( "select count(*)count,* from ( select > >> >count(*)count,* > >> >from addresses join users on users.address_id=addresses.id ) > >address > >> >join > >> >pets pet on pet.user_id='address.user.id';" ) ); > >> > > >> > > >> >13:34:27.325|212800001160~sql_module.cc(571):Do > >> >Command[04F1ECF4:test.db]: > >> >select count(*)count,* from ( select count(*)count,* from > >addresses > >> >join > >> >users on users.address_id=addres > >> >ses.id ) address join pets pet on pet.user_id='address.user.id'; > >> >13:34:27.326|212800001160~sack.cc(97503):Sqlite3 Err: (284) > >automatic > >> >index > >> >on users(address_id) > >> >13:34:27.326|212800001160~sack.cc(104891):0 > >> >13:34:27.326|212800001160~sack.cc(101458):Column 0 : > >> >table_name:(null) > >> >origin_name:(null) table_alias:(null) > >> >13:34:27.327|212800001160~sack.cc(101458):Column 1 : > >> >table_name:(null) > >> >origin_name:(null) table_alias:(null) > >> >13:34:27.327|212800001160~sack.cc(101458):Column 2 : > >> >table_name:addresses > >> >origin_name:id table_alias:addresses > >> >13:34:27.327|212800001160~sack.cc(101458):Column 3 : > >> >table_name:addresses > >> >origin_name:name table_alias:addresses > >> >13:34:27.327|212800001160~sack.cc(101458):Column 4 : > >table_name:users > >> >origin_name:id table_alias:users > >> >13:34:27.327|212800001160~sack.cc(101458):Column 5 : > >table_name:users > >> >origin_name:address_id table_alias:users > >> >13:34:27.328|212800001160~sack.cc(101458):Column 6 : > >table_name:users > >> >origin_name:name table_alias:users > >> >13:34:27.328|212800001160~sack.cc(101458):Column 7 : > >table_name:pets > >> >origin_name:id table_alias:pet > >> >13:34:27.328|212800001160~sack.cc(101458):Column 8 : > >table_name:pets > >> >origin_name:user_id table_alias:pet > >> >13:34:27.328|212800001160~sack.cc(101458):Column 9 : > >table_name:pets > >> >origin_name:name table_alias:pet > >> >13:34:27.328|212800001160~sack.cc(104418):no data > >> >[ > >> > { > >> > count: 0, > >> > 'address.count': null, > >> > 'address.addresses.id': null, > >> > 'address.addresses.name': null, > >> > 'address.users.id': null, > >> > 'address.users.address_id': null, > >> > 'address.users.name': null, > >> > 'pet.id': null, > >> > 'pet.user_id': null, > >> > 'pet.name': null > >> > } > >> >] > >> > > >> >Hmm... I don't get any values that way, I wonder what happens? > >> > > >> >I suppose parsing that might be an option; not sure I can > >guarantee > >> >databases will always pragma longname.... > >> >_______________________________________________ > >> >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 > > > > _______________________________________________ > 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