为什么"select table_name from table_name"有效



此语法对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 变体中都不存在。

如果创建一个表,Postgres 会在后台创建一个同名的类型。然后,该表本质上是"该类型的列表"。

Postgres还允许将整行引用为单个"记录" - 从多列构建的值。这些记录可以通过行构造函数动态创建。

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;

相关内容

最新更新