Sql 如果横向联接不获取任何行,则Postgres返回空表

Sql 如果横向联接不获取任何行,则Postgres返回空表,sql,postgresql,Sql,Postgresql,每次用户登录以获取相关数据时,我都会运行下面的查询 SELECT ac.username,ac.password, (array_agg(json_build_object('message',pm.message,'username',pm.username,'message_id',pm.message_id)))[0:10] AS messages, p.project_name,p.project_id FROM account ac, LATERAL(SELECT * FROM acc

每次用户登录以获取相关数据时,我都会运行下面的查询

SELECT ac.username,ac.password,
(array_agg(json_build_object('message',pm.message,'username',pm.username,'message_id',pm.message_id)))[0:10] AS messages,
p.project_name,p.project_id
FROM account ac,
LATERAL(SELECT * FROM accounts_projects WHERE ac.user_id = accounts_projects.account_id) ap,
LATERAL(SELECT * FROM project_messages WHERE ap.project_id = project_messages.project_id ORDER BY project_messages.message_id) pm,
LATERAL(SELECT * FROM project WHERE project.project_id = ap.project_id) p
WHERE ac.username=$1
GROUP BY p.project_name,p.project_id,ac.user_id;
假设我有2个用户-

用户1已加入项目(accounts\u projects表)->他获得以下输出

  username: 'kannaj',
  projects: 
   [ { project_name: 'Machine Learning with Python',
       messages: [Object],
       project_id: 1 },
     { project_name: 'Beethoven with react',
       messages: [Object],
       project_id: 3 },
     { project_name: 'Football with Javascript',
       messages: [Object],
       project_id: 2 } ] }
但是,如果有一个新用户不属于帐户\u项目。postgres返回一个空行。i、 e是否仅根据用户名和其他列的空值获取ac.user\u id和密码

如果没有找到数据,我是否可以让postgres忽略或为横向连接返回null?理想情况下,它应该只获取ac.username和ac.password

看起来一个简单的左连接就可以了。我尝试像这样更新查询

LEFT JOIN LATERAL(SELECT * FROM accounts_projects WHERE ac.user_id = accounts_projects.account_id) ap,
LEFT JOIN LATERAL(SELECT * FROM project_messages WHERE ap.project_id = project_messages.project_id ORDER BY project_messages.message_id) pm,
LEFT JOIN LATERAL(SELECT * FROM project WHERE project.project_id = ap.project_id) p
但是我得到了下面的错误

ERROR:  syntax error at or near "JOIN"
LINE 6: LEFT JOIN LATERAL(SELECT * FROM accounts_projects WHERE ac.u...
             ^
********** Error **********

ERROR: syntax error at or near "JOIN"
SQL state: 42601
Character: 206

像往常一样,连接应该有连接条件:“连接on”来抱怨可能是“on TRUE”

尝试:


改为在true上使用左连接横向(…)。@Abelisto-我刚刚更新了问题。。我确实用了左撇子。。但是我遇到了一个语法错误:(…我还没有尝试过使用'on true'是的..结果证明我不需要使用逗号:/确切地说,就像使用常规联接一样:)谢谢你的帮助。。无论如何,我都会同意你的回答;)
SELECT ac.username,ac.password,
(array_agg(json_build_object('message',pm.message,'username',pm.username,'message_id',pm.message_id)))[0:10] AS messages,
p.project_name,p.project_id
FROM account ac
LEFT JOIN LATERAL(SELECT * FROM accounts_projects WHERE ac.user_id = accounts_projects.account_id) ap ON TRUE
LEFT JOIN LATERAL(SELECT * FROM project_messages WHERE ap.project_id = project_messages.project_id ORDER BY project_messages.message_id) pm ON TRUE
LEFT JOIN LATERAL(SELECT * FROM project WHERE project.project_id = ap.project_id) p ON TRUE
WHERE ac.username=$1
GROUP BY p.project_name,p.project_id,ac.user_id;