2008-10-16 2 views
9

У меня большой запрос в базе данных PostgreSQL. Запросов что-то вроде этого:Просмотреть ошибку в PostgreSQL

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

Когда я запускаю этот запрос в качестве запроса SQL, то он возвращает строку разыскиваемого.

Но когда я попытался использовать тот же запрос, чтобы создать представление, он возвращает ошибку:

«Ошибка: столбец„Идентификатор“указан несколько раз.»

(я использую pgAdminIII при выполнении запросов.)

Я думаю, это происходит потому, что будет иметь ResultSet более чем один столбец с именем «ID». Есть ли способ решить это, не записывая все имена столбцов в запросе?

ответ

11

Это происходит из-за того, что представление имеет два столбца с именованным именем, один из таблицы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 
+3

Есть ли способ автоматически присваивать имена таблиц именам столбцов в результате запроса SELECT *? – nnyby 2012-08-16 18:04:29

-2

Нет встроенный способ на языке, чтобы решить эту проблему (и, честно говоря, * плохая практика в целом, потому что это может привести к появлению скрытых дефектов при изменении схем таблиц - вы можете сделать 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 
+0

нет ничего похожего на @SOMETHING в PostgreSQL. – 2009-09-29 17:24:50

+0

Существует также не использование [] для цитирования идентификаторов. И не CHAR(). И никакой инструкции PRINT. – 2009-09-29 19:16:51

11

Если только присоединиться столбцы дублируются (т.е. имеют одинаковые имена), то вы можете уйти с изменением:

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

к:

select * 
from a join b using (id) 
0

Если вы попали сюда потому, что вы пытаетесь использовать функцию, как to_date и получение «определены более чем один раз» ошибка, обратите внимание, что вам нужно использовать псевдоним столбца для функций , например:

to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date 
Смежные вопросы