Добавьте столбец для просмотра без использования ALTER TABLE

#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 () то, что должно сделать это быстрее.