存在用于SQL的光滑函数
我想在此基础上构造一个SQL,但尽量不要使用sqlu存在用于SQL的光滑函数,sql,scala,slick,Sql,Scala,Slick,我想在此基础上构造一个SQL,但尽量不要使用sqlu select el.oid, el.name, el.res_cat from el left join bk on (el.cat = bk.cat and bk.oid=100) where not exists (select 1 from dates bd where el.oid=bd.lots_oid and bd.bk_oid = bk.oid) and el.e_oid=bk.e_oid SQL存在或不
select el.oid, el.name, el.res_cat from el
left join bk on (el.cat = bk.cat and bk.oid=100)
where not exists (select 1 from dates bd where
el.oid=bd.lots_oid and bd.bk_oid = bk.oid) and el.e_oid=bk.e_oid
SQL存在
或不存在
是否有灵活的函数?谢谢
更新1
当我再次访问我的光滑代码时,我意识到了我的错误。我想为我设置的错误警报道歉。这不是一个答案,希望有人能帮助我纠正我的错误。目前,我正在使用Slick的纯SQL继续我的工作
我构建的巧妙的查询不起作用。它接近我想要的SQL。我所做的是
val elQuery = elTable.joinLeft(bkTable)
.on((el, bk) => el.cat === bk.cat && bk.oid === 100)
val query = for {
a <- elQuery if bdTable.filterNot(bd => a._2.map(_.oid === bd.bkOid).isDefined && a._1.oid === bd.elOid).exists
} yield a
finalQuery.result.statements.foreach(x => Logger.debug(s"xx => $x"))
val elQuery=elTable.joinLeft(bkTable)
.on((el,bk)=>el.cat==bk.cat&&bk.oid==100)
val query=for{
a._2.map(_.oid==bd.bkOid).isDefined&&a._1.oid==bd.elOid.)存在
}产生
finalQuery.result.statements.foreach(x=>Logger.debug(s“xx=>$x”))
我注意到,
filterNot
不会生成SQL不存在
。这是我失去的另一部分 我还没有足够的声誉发表评论。但我假设您想要获取dates表中不存在的所有行。我将重写您的查询,如下所示:
SELECT
el.oid, el.name, el.res_cat.cat
FROM
el
LEFT JOIN bk ON bk.cat = el.cat
AND bk.e_oid = el.e_oid
AND bk.oid = 100
LEFT JOIN dates bd ON bd.lots_oid = el.oid
AND bd.bk_oid = bk.oid
WHERE
bd.lots_oid IS NULL
说明:
您可以通过左连接日期
并在中指定日期的主键(PK)为空的条件,而不是采用不存在
,实现相同的效果。我不知道dates表的主键,所以我只添加了我知道的列。您应该将其调整为日期表的主键
LEFT JOIN
ing和WHERE PK为NULL
可确保左联接表中不存在该行。如果您的问题中有一些示例数据,那就太好了。您尝试过什么?是什么让你认为Slick不支持他们?在Slick里有一个嵌入式操作员。不确定这是不是你想要的though@TheArchetypalPaul我尝试了存在
,但我不确定是否正确使用了它。阅读您提供的链接后,我将重试。我可以按照@TheArchetypalPaul建议的链接构造我想要的SQL。官方文档以最简单的方式显示了exists
,如果我没有看到其他示例,我没有想到SQL exists
是在for CONTRUSION筛选器中生成的。这实际上并没有回答问题,尽管它可以帮助OP获得他们想要的数据。这是一个关于Slick的问题,而不是关于如何重写查询。诚然,这不是我想要的,但如果不使用SQL exists
,它就解决了我的问题,我会很好。出现这个问题是因为我确信SQL存在
将解决我的问题。不过我可能错了。顺便说一句,左连接中的'bk.e_oid=el.e_oid'不会产生右结果。我认为应该把它放在左边。我还没有试过。