Поведение предложения VALUES в PostgreSQL - PullRequest
0 голосов
/ 24 декабря 2018

В 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

Аналогично, хотя это работает (при условии, что 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, когда используют эти предложения независимо?

Что послужило причиной такого несоответствия в дизайне?

1 Ответ

0 голосов
/ 24 декабря 2018

Синтаксис для использования VALUES с выбором, безусловно, отличается от того, как он используется в большинстве разновидностей SQL со вставкой.При этом проблема с Postgres на самом деле, похоже, заключается в том, что предложение VALUES должно быть заключено в круглые скобки как подзапрос, чтобы его можно было использовать с select (иначе это не сработает).Таким образом, мы можем считать следующее эквивалентным любому другому подзапросу:

select *
from
(
    values (1,'a'), (2, 'b')
) t;

Если бы предложение VALUES было заменено на выборку, нам пришлось бы псевдоним подзапроса, и то же самое вернос VALUES.Что касается , почему Postgres решил сделать это, вам, возможно, придется проверить документацию или задать вопрос на их форуме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...