#sql #postgresql
Вопрос:
У меня есть CTE
, что-то вроде
CREATE VIEW someView AS WITH foo AS ( SELECT id FROM bar JOIN ... ), foo2 AS ( SELECT whatever FROM bar2 ... ), ... AS ( ... ), lastResult AS ( ... ) SELECT * FROM lastResult;
Я хочу добавить id column
к последнему SELECT
утверждению ( SELECT * FROM lastResult;
). На существующей таблице вы бы сделали это так
ALTER TABLE lastResult ADD COLUMN id SERIAL PRIMARY KEY;
Возможно ли это с а CTE
и а View
?
Комментарии:
1. Вы имеете в виду, что вам нужен уникальный ключ в последнем результате?
2. @MiladDastanZand Да, я знаю. Путем создания одного, а не путем выбора одного из других результатов, таких как
foo
илиfoo2
3. Я думаю, вы можете использовать номера строк, я напишу простой пример
Ответ №1:
Я думаю, вы можете использовать номер СТРОКИ. вот пример
CREATE VIEW someView AS WITH foo AS ( SELECT id FROM bar JOIN ... ), foo2 AS ( SELECT whatever FROM bar2 ... ), ... AS ( ... ), lastResult AS ( ... ) SELECT * , ROW_NUMBER () OVER (ORDER BY Your_Column) as Id FROM FROM lastResult;
Комментарии:
1. Это работает, но это делает мой запрос действительно очень медленным…
2. Да, это основано на количестве ваших строк и может быть медленным, этот побочный эффект невозможно избежать, можно повысить производительность, вы можете проверить столбец Your_Column, который используется в предложении order by, возможно, вам потребуется создать индекс для него.
3. @Stophface: если вам «просто» нужен уникальный номер, но без какого-либо гарантированного заказа, вы можете использовать
row_number() over ()
то, что должно сделать это быстрее.