代码之家  ›  专栏  ›  技术社区  ›  ps0604

三个表的左外连接,有两个条件,每个条件都不工作

  •  0
  • ps0604  · 技术社区  · 8 年前

    我想在Slick中表示以下左外连接:

    select * from tableD d 
    left outer join tableE e on e.ds_sk=d.ds_sk and e.ds_type = d.ds_type
    left outer join tableV v on v.es_sk=e.sk and v.var_name=d.var_name
    where e.sk=30;
    

    请注意,每个关系都包含两个连接条件。第一个连接条件介于 tableD tableE ,第二个连接条件介于 tableV , 表格 表格 . 最后,还有一个 where 条件

    这是我的尝试(引发编译错误):

      val query = for {
        ((d, e), v) <- tableE joinLeft tableD on ((x,y) => x.dsType === y.dsType && x.dsSk === y.dsSk) 
                              joinLeft tableV on ((x,y) => x._1.sk === y.esSk && x._2.varName === y.varName) 
                       if (e.sk === 30) 
      } yield (d,e,v)
    

    我得到的错误是:

    值varName不是slick的成员。举起。Rep[选项[表格]]

    错误是什么以及如何修复此代码?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Leo C    8 年前

    SQL查询(D leftjoin E leftjoin V)和Slick查询(E leftjoin D leftjoin V)之间似乎存在差异。

    假设您的SQL查询是正确的版本,平滑查询应该如下所示:

    val query = for {
      ((d, e), v) <- tableD joinLeft tableE on ( (x, y) =>
                       x.dsType === y.dsType && x.dsSk === y.dsSk ) 
                            joinLeft tableV on ( (x, y) =>
                       x._2.map(_.sk) === y.esSk && x._1.varName) === y.varName ) 
                       if (e.sk === 30) 
      } yield (d,e,v)
    

    注意,在第二个 joinLeft ,您需要使用 map 访问包装在中的表格中的字段 Option 第一次之后 连接左侧 . 这也解释了为什么您会收到关于 Option[tableD] 在你巧妙的提问中。

        2
  •  0
  •   Rodo    8 年前

    你可以比较一下 地图 通过varName,示例:

    ...  && x._2.map(_.varName) === y.varName ...
    

    这里我留下一个类似的例子:

      val withAddressesQuery = for {
       (((person, phone), _), address) <- withPhonesQuery.
               joinLeft(PersonAddress).on(_._1.personId === _.personId).
               joinLeft(Address).on(_._2.map(_.addressId) === _.addressId)
      } yield (person, phone, address)
    

    注意:。。。打开(\u.\u 2。 地图 (.addressId)===。。。 see complete

    还有更多关于joinLeft的信息 Chapter 6.4.3 属于 Essential Slick .

    推荐文章