我有以下左外连接,我想在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
,tableE
和tableD
之间。最后,还有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]]
错误是什么以及如何修复此代码?
答案 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的更多信息。