为什么“从表名中选择表名”有效

时间:2018-08-23 18:53:57

标签: postgresql

此语法对PostgreSQL有效:

select T from table_name as T

T似乎已成为table_name中所有列的值的CSV列表。 select T from table_name as T有效,因此select table_name from table_name有效。该语法在哪里记录,T的数据类型是什么?

此语法不在SQL Server中,并且(AFAIK)在其他任何SQL变体中都不存在。

1 个答案:

答案 0 :(得分:2)

如果创建表,Postgres将在后台创建一个具有相同名称的type。该表实际上就是“该类型的列表”。

Postgres还允许将完整的行作为单个“记录”引用-由多个列构建的值。这些记录可以通过row constructor动态创建。

SELECT语句结果中的每一行都隐式地分配了TYPE-如果该行来自单个表,则为表的类型。否则,它是一个匿名类型。

在允许列的位置使用表名时,它会将整行引用为一条记录。如果表在选择中带有别名,则该记录的类型仍然是表的类型。

因此,声明:

select T 
from table_name as T;

返回带有列的结果,该列是包含表的每一列作为字段的(表类型的)记录。记录的默认输出格式是用逗号分隔的括号内的值列表。

假设table_name具有三列c1c2c3,则以下内容基本上会做同样的事情:

select row(c1, c2, c3)
from table_name;

请注意,记录参考也可以用于比较,例如查找两个表之间不同的行可以通过以下方式完成

select *
from table_one t1
  full outer join table_two t2 on t1.id = t2.id
where t1 <> t2;