Это дополнительный вопрос к более раннему. У меня есть хранимая функция f1
, которая принимает два аргумента и возвращает таблицу с 5 столбцами; на данный момент возвращаемые значения являются постоянными, позже они будут вычислены из аргументов.
У меня также есть таблица 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;
select *
— вместо этого выберите нужные поля. Как есть,c1
существует как вf1
, так и вt1
... - person sgeddes   schedule 05.08.2016c4
. Отличные ответы PostgreSQL здесь, кстати. - person Drux   schedule 05.08.2016