Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 带有横向联接的查询返回带括号的值。如何删除它?_Sql_Postgresql_Lateral Join - Fatal编程技术网

Sql 带有横向联接的查询返回带括号的值。如何删除它?

Sql 带有横向联接的查询返回带括号的值。如何删除它?,sql,postgresql,lateral-join,Sql,Postgresql,Lateral Join,我正在使用Postgres作为聊天应用程序。我有两个表,一个是会话ID和参与者,另一个是消息 我正在运行以下查询以获取用户的所有对话,并使用横向联接来包含结果中的最后一条消息: select c.id, c.title, c.members, max(m.created_at) delivered_at, last_message from conversations c join messages m on c.id = m.conversation_id left join lateral

我正在使用Postgres作为聊天应用程序。我有两个表,一个是会话ID和参与者,另一个是消息

我正在运行以下查询以获取用户的所有对话,并使用横向联接来包含结果中的最后一条消息:

select c.id, c.title, c.members, max(m.created_at) delivered_at, last_message
from conversations c
join messages m on c.id = m.conversation_id
left join lateral (select message from messages m where c.id = m.conversation_id order by created_at desc limit 1) last_message on true 
where array[4] <@ c.members 
group by c.id, last_message
order by delivered_at desc
它可以工作,但是消息作为消息而不是消息返回


我也不知道为什么,真的。有什么方法可以让我不必替换括号作为附加步骤吗?

您需要在选择列表中提及列名,而不是表名或别名:

select c.id, c.title, c.members, max(m.created_at) delivered_at, last_message
from conversations c
join messages m on c.id = m.conversation_id
left join lateral (select message from messages m where c.id = m.conversation_id order by created_at desc limit 1) as t(last_message) on true 
where array[4] <@ c.members 
group by c.id, last_message
order by delivered_at desc
此查询生成一个复合值列,因此我们可能会得到如下输出:

      c
------------------------
 ("fuzzy dice",42,1.99)

(1 row)
但是请注意,简单名称与表名称之前的列名相匹配,因此此示例仅适用于查询的表中没有名为c的列的情况

普通限定列名语法table_name.column_name可以理解为将字段选择应用于表当前行的复合值。出于效率原因,它实际上并没有以这种方式实现

当我们写作时

SELECT c.* FROM inventory_item c;
然后,根据SQL标准,我们应该将表的内容展开为单独的列:

 name    | supplier_id | price
------------+-------------+-------
 fuzzy dice |          42 |  1.99
(1 row)
就好像这个问题是

SELECT c.name, c.supplier_id, c.price FROM inventory_item c;
引自以下链接:

您需要在选择列表中提及列名,而不是表名或别名:

select c.id, c.title, c.members, max(m.created_at) delivered_at, last_message
from conversations c
join messages m on c.id = m.conversation_id
left join lateral (select message from messages m where c.id = m.conversation_id order by created_at desc limit 1) as t(last_message) on true 
where array[4] <@ c.members 
group by c.id, last_message
order by delivered_at desc
此查询生成一个复合值列,因此我们可能会得到如下输出:

      c
------------------------
 ("fuzzy dice",42,1.99)

(1 row)
但是请注意,简单名称与表名称之前的列名相匹配,因此此示例仅适用于查询的表中没有名为c的列的情况

普通限定列名语法table_name.column_name可以理解为将字段选择应用于表当前行的复合值。出于效率原因,它实际上并没有以这种方式实现

当我们写作时

SELECT c.* FROM inventory_item c;
然后,根据SQL标准,我们应该将表的内容展开为单独的列:

 name    | supplier_id | price
------------+-------------+-------
 fuzzy dice |          42 |  1.99
(1 row)
就好像这个问题是

SELECT c.name, c.supplier_id, c.price FROM inventory_item c;
引自以下链接:

您是指列名还是值?请提供示例数据和所需输出您是指列名还是值?请提供样本数据和所需输出