В Postgres, согласно его doc , работает следующее:
select 1 as column1, 'one' as column2
union all
select 2, 'two'
union all
select 3, 'three'
, однако его расширение:
select * from (select 1 as column1, 'one' as column2
union all
select 2, 'two'
union all
select 3, 'three')
приводит к ошибке:
![enter image description here](https://i.stack.imgur.com/EGK6j.png)
Аналогично, хотя это работает (при условии, что Postgres создает внутренний псевдоним?):
values(1,'a'), (2, 'b')
следующие ошибки приводят к ошибке, требующей псевдоним:
select * from (values(1,'a'), (2, 'b'))
и начинает работать только при наличии такого псевдонима:
select * from (values(1,'a'), (2, 'b')) t(z,y)
Такое же несоответствие также применимо к предложению SELECT, то есть:
select 1, 2
работает независимо, но не как подвыбор:
select * from (select 1, 2)
, если не предоставлен псевдоним:
select * from (select 1, 2) t(a, b)
Разве это не будет логическим продолжением поведения предложений, касающихся множеств ( SELECT, VALUES и т. Д.), Чтобы предположить наличие некоторого внутреннего псевдонима при использовании внутри другого выбора, как это делает Postgres, когда используют эти предложения независимо?
Что послужило причиной такого несоответствия в дизайне?