用Scala滑面进行外部连接

用Scala滑面进行外部连接,scala,slick,Scala,Slick,我有两个表,User和UserBusinessPartnerIds 用户(id、姓名、电子邮件等) UserBusinessPartnerIds(userId,bpId) 我正在尝试检索用户和业务合作伙伴ID列表 下面的查询工作正常 database withSession { implicit session: Session => val query = (for { (user, userBpid) <- Users leftJoin UserBus

我有两个表,
User
UserBusinessPartnerIds

用户(id、姓名、电子邮件等)

UserBusinessPartnerIds(userId,bpId)

我正在尝试检索用户和业务合作伙伴ID列表

下面的查询工作正常

database withSession { implicit session: Session =>
      val query = (for {
        (user, userBpid) <- Users leftJoin UserBusinessPartners on (_.id is _.userId)
          if user.email === email &&
             user.password === password &&
             user.active === true &&
             userBpid.dateFrom < today &&
             userBpid.dateTo > today
      } yield (user.id, userBpid.bpId.?))

      val results = query.list

      results.headOption.map( row  => User(row._1, email, password, results.map(_._2).flatten.toSet))
    }
数据库与会话{隐式会话:会话=>
val查询=(用于{
(用户,userBpid)今天
}收益率(user.id、userBpid.bpId.?)
val results=query.list
results.headOption.map(row=>User(row.\u 1、电子邮件、密码、results.map(\u.\u 2).flatte.toSet))
}
诚然,法典的终结是令人发指的;但不管怎样

问题是,我想做一个外部连接。因此,如果一个用户没有与另一个表中的业务伙伴id对应的行,我仍然希望获得该用户

有什么想法吗


编辑-将问题编辑为实际正确。我仍然希望返回一个用户,即使他们没有与之关联的业务合作伙伴ID,生成的sql是什么样子的?应该是左外连接

我怀疑问题在于:

userBpid.dateFrom < today && userBpid.dateTo > today

您需要在加入之前筛选UserBusinessPartners表,这将为您提供没有业务合作伙伴的用户。 比如:

database withSession { implicit session: Session =>
  userBP = UserBusinessPartners.filter(ubp => ubp.dateFrom < today && ubp.dateTo > today)
  val query = (for {
    (user, userbp) <- Users leftJoin userBP on (_.id is _.userId)
      if user.email === email &&
         user.password === password &&
         user.active === true 
  } yield (user.id, userbp.bpId.?))

  val results = query.list

  results.headOption.map( row  => User(row._1, email, password, results.map(_._2).flatten.toSet))
}
数据库与会话{隐式会话:会话=>
userBP=UserBusinessPartners.filter(ubp=>ubp.dateFromtoday)
val查询=(用于{
(user,userbp)user(第1行,电子邮件,密码,results.map(u._2).flatte.toSet))
}
过滤器将向您显示一个仅包含所需业务合作伙伴的表视图,左侧连接将列出所有用户

您的查询失败,原因是:

userBpid.dateFromtoday


因为根据上述条件,选择的userBpid为null的行将被过滤掉。

是的,对不起,应该指出这就是问题所在。我们如何“选择性地”如果可能无法返回日期范围,请检查它们。仅使用用户合作伙伴上的用户外部连接,您无法提供dateFrom/dateTo条件。如果您使用用户内部连接user-partner1和外部连接user-partner2,则您应该在业务中。我想我不太明白,是否愿意编辑您的答案以显示一些甜蜜的ka示例rma?遗憾的是,您提出的解决方案似乎没有奏效;它仍然没有进行外部连接。至少它没有任何编译器问题!
database withSession { implicit session: Session =>
  userBP = UserBusinessPartners.filter(ubp => ubp.dateFrom < today && ubp.dateTo > today)
  val query = (for {
    (user, userbp) <- Users leftJoin userBP on (_.id is _.userId)
      if user.email === email &&
         user.password === password &&
         user.active === true 
  } yield (user.id, userbp.bpId.?))

  val results = query.list

  results.headOption.map( row  => User(row._1, email, password, results.map(_._2).flatten.toSet))
}