三个表的左外连接有两个条件,每个条件在Slick中不起作用

时间:2018-02-06 23:50:36

标签: scala slick slick-3.0

我有以下左外连接,我想在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;

请注意,每个关系包含两个连接条件。第一个加入条件介于tableDtableE之间,第二个加入条件介于tableVtableEtableD之间。最后,还有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)

我得到的错误是:

  

◾valuevarName不是slick.lifted.Rep的成员[Option [tableD]]

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

2 个答案:

答案 0 :(得分:1)

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

假设您的SQL查询版本正确,则Slick查询应如下所示:

this.client.on('pubsub:event', function (msg) {
      console.log("pubsub:event");
      console.log(msg);
    });

请注意,在第二个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来访问tableE中的字段,该字段在第一个map之后包含在Option中。这也解释了为什么您在Slick查询中收到有关joinLeft的错误消息。

答案 1 :(得分:0)

你可以比较用varName做 map ,例如:

...  && 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)

注意:......上(_._ 2. 地图(_.addressId)=== ...... see complete

Chapter 6.4.3 Essential Slick中有关于joinLeft的更多信息。