Это следующий вопрос к earlier one. У меня есть хранимая функция f1
, которая принимает два аргумента, возвращает таблицу с 5 столбцами; теперь возвращаемые значения являются постоянными, позже они будут вычисляться из аргументов.«ОШИБКА: столбец ... указанный более одного раза» в определении VIEW
У меня также есть таблица t1
с двумя столбцами, которые соответствуют по типу аргументам f1
.
Теперь я хотел бы определить вид v1
, который содержит объединение всех строк, возвращаемых с f1
для всех пар аргументов, хранящихся в t1
. Для приведенного примера значения результат должен быть:
+---+---+---+---+---+---+---+
| 2 | 3 | a | b | 1 | c | d |
+---+---+---+---+---+---+---+
| 4 | 5 | a | b | 1 | c | d |
+---+---+---+---+---+---+---+
Если первые два столбца лишены, что было бы хорошо, как хорошо. Обратите внимание, что f1
может возвращать несколько строк для определенных значений аргументов.
Я попробовал следующее заявление, но это дает мне сообщение об ошибке:
ERROR: column "c4" specified more than once
CREATE VIEW v1 (c1, c2, c3, c4, c5)
AS SELECT * FROM
(SELECT c1, c2 FROM t1) AS x,
f1 (x.c1, x.c2);
Что я делаю неправильно?
Вот предшествующие заявления, чтобы установить пример вверх:
CREATE OR REPLACE FUNCTION f1 (a1 INTEGER, a2 INTEGER)
RETURNS TABLE (c1 VARCHAR(20), c2 VARCHAR(20), c3 INTEGER, c4 VARCHAR(20), c5 VARCHAR(128))
AS $$
SELECT 'a'::VARCHAR(20), 'b'::VARCHAR(20), 1::INTEGER, 'c'::VARCHAR(20), 'd'::VARCHAR(128);
$$ LANGUAGE SQL;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (c1 INTEGER, c2 INTEGER);
INSERT INTO t1 (c1, c2)
VALUES (2,3), (4,5);
DROP VIEW IF EXISTS v1;
Не используйте '' * выберите - вместо того, чтобы выбрать поля, которые нужно. Как есть, 'c1' существует как в' f1', так и 't1' ... – sgeddes
@sgeddes Я попробую, но сообщение об ошибке цитирует' c4'. Отличные ответы PostgreSQL здесь, BTW. – Drux