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')

-- 
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

Reply via email to