别名后的括号

时间:2018-05-11 18:40:50

标签: sql postgresql

我遇到了一篇关于使用generate_series创建表数据的简洁文章。作者在解释代码方面做得很好,但有些事情我还是不明白。别名comp3syl(x)z2(x)之后的x是将派生表的列名分配给x?这个语法叫什么?我在浏览没有关键字的文档时遇到了麻烦

SELECT(
SELECT concat_ws(' ',name_first, name_last) as generated
FROM (
    SELECT string_agg(x,'')
    FROM (
        select start_arr[ 1 + ( (random() * 25)::int) % 16 ]
        FROM
        (
            select '{CO,GE,FOR,SO,CO,GIM,SE,CO,GE,CA,FRA,GEC,GE,GA,FRO,GIP}'::text[] as start_arr
        ) syllarr,
        -- need 3 syllabes, and force generator interpretation with the '*0' (else 3 same syllabes)
        generate_series(1, 3 + (generator*0))
    ) AS comp3syl(x)
) AS comp_name_1st(name_first),
(
    SELECT x[ 1 + ( (random() * 25)::int) % 14 ]
    FROM (
        select '{Ltd,& Co,SARL,SA,Gmbh,United,Brothers,& Sons,International,Ext,Worldwide,Global,2000,3000}'::text[]
    ) AS z2(x)
) AS comp_name_last(name_last)
)
FROM generate_series(1,10000) as generator

对于任何感兴趣的人都是文章的链接:https://regilero.github.io/postgresql/english/2017/06/26/postgresql_advanced_generate_series/

2 个答案:

答案 0 :(得分:2)

来自documentation

  

另一种形式的表别名为表的列以及表本身提供临时名称:

     

FROM table_reference [AS]别名(column1 [,column2 [,...]])

     

如果指定的列别名少于实际表中的列,则不会重命名其余列。此语法对自联接或子查询特别有用。

在您给出的generate_series()调用的代码中,子查询本身没有别名,因此作者在为子查询添加别名时为其命名。

答案 1 :(得分:1)

在某些数据库中,但不是全部,表别名可以采用列别名列表。这是表别名所定义的列的引用方式。

考虑以下两个问题:

select *
from (values (1)) x;

select *
from (values (1)) x(a);

在第一个中,返回的一列是未命名的。在第二个中,该列称为“a”。

将其与generate_series()一起使用的原因是该函数返回一列 - 实际上是一个非常有用的列。但是你怎么称呼呢?我通常使用类似gs(n)的内容,因此该列称为gs.n。您也可以只使用generate_series() n,该列可以称为nn.n

对于子查询本身,我总是将列别名放在子查询中。并非所有数据库都支持使用表别名命名列,因此更容易在子查询中命名列。