此语法对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变体中都不存在。
答案 0 :(得分:2)
如果创建表,Postgres将在后台创建一个具有相同名称的type。该表实际上就是“该类型的列表”。
Postgres还允许将完整的行作为单个“记录”引用-由多个列构建的值。这些记录可以通过row constructor动态创建。
SELECT语句结果中的每一行都隐式地分配了TYPE-如果该行来自单个表,则为表的类型。否则,它是一个匿名类型。
在允许列的位置使用表名时,它会将整行引用为一条记录。如果表在选择中带有别名,则该记录的类型仍然是表的类型。
因此,声明:
select T
from table_name as T;
返回带有单列的结果,该列是包含表的每一列作为字段的(表类型的)记录。记录的默认输出格式是用逗号分隔的括号内的值列表。
假设table_name
具有三列c1
,c2
和c3
,则以下内容基本上会做同样的事情:
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;