如果横向连接不提取任何行,Postgres将返回空表

时间:2016-05-24 20:12:48

标签: sql postgresql

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

import scala.collection.immutable

def sumToEither(xs: immutable.Seq[Double]): Either[String, Double] = {
  @annotation.tailrec
  def go(ys: immutable.Seq[Double], acc: Double): Double =
    if (ys.isEmpty || acc.isInfinite || acc.isNaN) acc
    else go(ys.tail, ys.head + acc)
  go(xs, 0.0) match {
    case x if x.isInfinite => Left("overflow")
    case x if x.isNaN => Left("NaN")
    case x => Right(x)
  }
}

假设我有2个用户 -

用户1已加入项目(accounts_projects表) - >他得到以下输出

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;

但是,如果新用户不属于accounts_projects。 postgres返回一个空行。即只需获取ac.user_id&密码基于用户名和其他列的空值?

无论如何,如果没有找到数据,我可以将postgres发送到忽略或为横向联接返回null吗?理想情况下,它只应该获取ac.username和ac.password。

它看起来像一个简单的LEFT JOIN应该做的伎俩。我尝试像这样更新查询

  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 } ] }

但我收到以下错误

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

1 个答案:

答案 0 :(得分:2)

像往常一样,JOIN应该具有连接条件:“加入<表达式> on< join condition>”抱怨可能是“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;