У меня большой запрос в базе данных PostgreSQL. Запрос выглядит примерно так:
SELECT * FROM table1, table2, ... WHERE table1.id = table2.id...
Когда я запускаю этот запрос как sql-запрос, он возвращает нужную строку.
Но когда я пытаюсь использовать тот же запрос для создания представления, он возвращает ошибку:
"ошибка: идентификатор столбца" указан более одного раза ".
(Я использую pgAdminIII при выполнении запросов.)
Я предполагаю, что это происходит потому, что в наборе результатов будет более одного столбца с именем «id». Есть ли способ решить эту проблему, не записывая все имена столбцов в запросе?


Это происходит потому, что представление будет иметь два столбца с именами id, один из таблицы 1 и один из таблицы 2, из-за выбора *.
Вам нужно указать, какой идентификатор вы хотите в представлении.
SELECT table1.id, column2, column3, ... FROM table1, table2
WHERE table1.id = table2.id
Запрос работает, потому что он может иметь столбцы с одинаковыми именами ...
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
В языке нет встроенного способа ее решения (и, честно говоря, * это плохая практика в целом, потому что это может вызвать скрытые дефекты при изменении схем таблиц - вы можете сделать table1. *, Table2.acolumn, tabl2.bcolumn если вам нужна вся одна таблица и выборочно из другой), но если PostgreSQL поддерживает INFORMATION_SCHEMA, вы можете сделать что-то вроде:
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
И вставьте результаты, чтобы не печатать. Конечно, вам нужно будет вручную присвоить псевдонимы столбцам с одинаковыми именами. Вы также можете использовать уникальные имена кодового поколения, если хотите (но я этого не делаю):
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
в PostgreSQL нет ничего похожего на @SOMETHING.
Также нет использования [] для цитирования идентификаторов. А не функция CHAR (). И никакого заявления PRINT.
Если дублируются только столбцы соединения (т. Е. Имеют одинаковые имена), можно обойтись изменением:
select *
from a, b
where a.id = b.id
к:
select *
from a join b using (id)
Это не устранило ошибку, но в любом случае это более удобный синтаксис.
Если вы попали сюда, потому что пытаетесь использовать такую функцию, как to_date, и получаете ошибку «определено более одного раза», обратите внимание, что вам нужно использовать псевдоним столбца для функций, например:
to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date
Есть ли способ автоматически добавлять имена таблиц к именам столбцов в результате запроса SELECT *?