View error in PostgreSQL

前端 未结 4 1314
南旧
南旧 2021-01-01 18:41

I have a large query in a PostgreSQL database. The Query is something like this:

SELECT * FROM table1, table2, ... WHERE table1.id = table2.id...


        
相关标签:
4条回答
  • 2021-01-01 18:51

    That happens because a view would have two id named columns, one from table1 and one from table2, because of the select *.

    You need to specify which id you want in the view.

    SELECT table1.id, column2, column3, ... FROM table1, table2 
    WHERE table1.id = table2.id
    

    The query works because it can have equally named columns...

    postgres=# select 1 as a, 2 as a;
     a | a
    ---+---
     1 | 2
    (1 row)
    
    postgres=# create view foobar as select 1 as a, 2 as a;
    ERROR:  column "a" duplicated
    postgres=# create view foobar as select 1 as a, 2 as b;
    CREATE VIEW
    
    0 讨论(0)
  • 2021-01-01 18:53

    If only join columns are duplicated (i.e. have the same names), then you can get away with changing:

    select *
    from a, b
    where a.id = b.id
    

    to:

    select *
    from a join b using (id)
    
    0 讨论(0)
  • 2021-01-01 18:58

    If you got here because you are trying to use a function like to_date and getting the "defined more than once" error, note that you need to use a column alias for functions, e.g.:

    to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date
    
    0 讨论(0)
  • 2021-01-01 19:14

    No built-in way in the language to solve it (and frankly, * is a bad practice in general because it can cause latent defects to arise as the table schemas change - you can do table1.*, table2.acolumn, tabl2.bcolumn if you want all of one table and selectively from another), but if PostgreSQL supports INFORMATION_SCHEMA, you can do something like:

    DECLARE @sql AS varchar
    
    SELECT @sql = COALESCE(@sql + ', ', '') 
        + '[' + TABLE_NAME + '].[' + COLUMN_NAME + ']'
        + CHAR(13) + CHAR(10)
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME IN ('table1', 'table2')
    ORDER BY TABLE_NAME, ORDINAL_POSITION
    
    PRINT @sql
    

    And paste the results in to save a lot of typing. You will need to manually alias the columns which have the same name, of course. You can also code-gen unique names if you like (but I don't):

    SELECT @sql = COALESCE(@sql + ', ', '') 
        + '[' + TABLE_NAME + '].[' + COLUMN_NAME + '] '
        + 'AS [' + TABLE_NAME + '_' + COLUMN_NAME + ']'
        + CHAR(13) + CHAR(10)
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME IN ('table1', 'table2')
    ORDER BY TABLE_NAME, ORDINAL_POSITION
    
    0 讨论(0)
提交回复
热议问题