【问题标题】:What does `select` the same table as `from` mean?`select` 和 `from` 同一张表是什么意思?
【发布时间】:2018-07-19 00:14:45
【问题描述】:

给定一张桌子

mytestdb=# select * from foo;
 id | name 
----+------
  4 | Tim
(1 row)

select foo from foo 输出什么,即selectfrom 同一张表是什么意思?谢谢。

mytestdb=# select foo from foo;
   foo   
---------
 (4,Tim)
(1 row)

谢谢。

我的问题来自于理解json_agg() 的输入是什么

mytestdb=# select json_agg(foo) from foo;
        json_agg         
-------------------------
 [{"id":4,"name":"Tim"}]
(1 row)

http://johnatten.com/2015/04/22/use-postgres-json-type-and-aggregate-functions-to-map-relational-data-to-json/

【问题讨论】:

  • 虽然看起来不太可能,但您偶然发现的代码必须适用于具有与表同名的列的表。
  • @RobertHarvey:它很好隐藏在文档中。

标签: postgresql


【解决方案1】:

在表的当前行的选择列表generates 中使用表名或别名composite value。将表名或别名传递给可以接受复合值的函数将为每一行调用该函数。

【讨论】:

  • 这很有趣。
【解决方案2】:

结构

SELECT foo FROM foo;

在 PostgreSQL 中称为 整行引用,因为它将整行作为一个检索。

如果您知道每个CREATE TABLE 都有一个隐含的CREATE TYPE,它定义了一个与表同名的复合类型,事情就会变得更清楚。

您可以通过查询目录轻松查看:

SELECT typname, typtype, typinput, typoutput
FROM pg_type
WHERE typname = 'text';

所以上面的查询结果是foo 类型的单个项目。由于是复合类型,所以用行表示法表示:用括号括起来,属性值用逗号隔开。

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多