Thread: How to disable duplicate columns

How to disable duplicate columns

From
"Andrus"
Date:
I have tables with large number of columns some of which are duplicate.
I need to use

SELECT t1.*, t2.* FROM t1 join  t2 using (t)

since I don't know all column names of t1 and t2 tables at design time.

In this case PostgreSQL returns table with duplicate columns.
How to force Postgres to return only first table column  when second table
contains column with same name?

Code to reproduce:

create table t1 ( id integer
  /*, a lot of other columns */ );
create table t2 ( id integer
  /*, a lot of other columns */ );
create table t3 as select t1.*,t2.* from t1 join t2 using (id);

Observed:

Error: Column name is duplicated

Expected:

t3 table should contain single id column

Andrus.



Re: How to disable duplicate columns

From
"Merlin Moncure"
Date:
On 4/8/07, Andrus <kobruleht2@hot.ee> wrote:
> I have tables with large number of columns some of which are duplicate.
> I need to use
>
> SELECT t1.*, t2.* FROM t1 join  t2 using (t)
>
> since I don't know all column names of t1 and t2 tables at design time.
>
> In this case PostgreSQL returns table with duplicate columns.
> How to force Postgres to return only first table column  when second table
> contains column with same name?

use can use a natural join:

select * from t1 natural join t2;

this will essentially look for columns that are in both tables, and do
an implicit 'using' on those columns.

be warned, this can lead to surprising behavior -- it only works if
you *want* identically named fields to be part of the join condition,
otherwise the results are undefined.

merlin

Re: How to disable duplicate columns

From
Stephan Szabo
Date:
On Sun, 8 Apr 2007, Andrus wrote:

> I have tables with large number of columns some of which are duplicate.
> I need to use
>
> SELECT t1.*, t2.* FROM t1 join  t2 using (t)
>
> since I don't know all column names of t1 and t2 tables at design time.
>
> In this case PostgreSQL returns table with duplicate columns.
> How to force Postgres to return only first table column  when second table
> contains column with same name?

There are a few cases where duplicate columns are trimmed, such as select
* from something with a join ...  using or natural join only should result
in one output column for the joined upon column names.

> Code to reproduce:
>
> create table t1 ( id integer
>   /*, a lot of other columns */ );
> create table t2 ( id integer
>   /*, a lot of other columns */ );
> create table t3 as select t1.*,t2.* from t1 join t2 using (id);

If only id were duplicated, then select * from t1 join t2 using(id)
should work.  If other columns are duplicated, then that won't work, but
generally just choosing the first column with a name seems bizarre in that
case.