我想在此构建一个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 exists
或not exists
的光滑功能?感谢
更新1
当我再次访问我的Slick代码时,我意识到了自己的错误。我想为我设置的误报道歉。这不是一个答案,希望有人可以帮助我纠正我的错误。目前,我正在使用Slick的纯SQL来继续我的工作。
我构建的Slick查询没有用。它接近我想要的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"))
我注意到filterNot
没有生成SQL not exists
。这是失去我的另一部分。
答案 0 :(得分:0)
我还没有足够的声誉来发表评论。但我假设你想获得所有不在日期表中退出的行。我会像下面一样重写你的查询:
Java version
说明:
您可以通过Application settings
实现相同的操作,而不是set "JAVA_HOME=D:\Program Files\Java\jdk1.8.0_73"
,并在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
条件上指定日期NOT EXISTS
的主键(PK)。我不知道日期表的PK,所以我只想添加我知道的列。您应该将其调整为日期表的PK。
LEFT JOIN dates
和WHERE
可确保您在左连接表格中不存在该行。