首先你做了什麼的是不是一個LEFT JOIN(我正在談論Slick版本)。爲了生成它,你需要使用joinLeft
方法。
但是這個簡單的修正是錯誤的 - 它產生子查詢這是壞的。
for {
(_, p) <- echoQuery.filter(_.id.isEmpty)
.joinLeft(programsVwQuery).on(_.id === _.id)
} yield (p.map(_.id))
旁註: 記住上面p
是Option
(它LEFT JOIN畢竟)。
更正的解決辦法是這樣的:
for {
(e, p) <- echoQuery
.joinLeft(programsVwQuery).on(_.id === _.id) if e.id.isEmpty
} yield (p.map(_.id))
這在我看來是一個好兆頭 - 它實際上讀起來幾乎像SQL。
完全正確的解決方案
上面產生一種加入你想不子查詢,但如果你把它比作你所需的查詢,它實際上不會產生你的目標是什麼。比,如果我們的SQL是這樣的(你想要的版本)如果Slick
通常可以理解爲SQL:
SELECT f.`id`
FROM `Full`.`programs_vw` f
LEFT JOIN `FULL`.`Echo` e ON f.`id`=e.`id`
WHERE e.`id` IS NULL
ORDER BY f.`id`;
比精確映射到油滑的版本是這樣的:
val query =
(for {
(p, e) <- programsVwQuery
.joinLeft(echoQuery).on(_.id === _.id) if e.map(_.id).isEmpty
} yield (p.id))).sortBy(id => id)
db.run(query.result) // this runs the query
基本上你去準確正如在這種情況下的SQL一樣。 它完美匹配您所需的查詢。如果你看看生成的SQL,就是你剛開始時想要的。
你能解釋一下爲什麼它不起作用嗎?輸出是什麼? –