2016-12-08 18 views
0

我是一個新手到油滑。斯卡拉華麗的左加入不工作

我想擺脫回聲表ID中不programs_vw表中存在的名單。

我寫的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`; 

我在http://slick.lightbend.com/doc/3.0.0/queries.html提到的例子,寫了這一點,但它不工作

val query = for { 
     (t, f) <- echoQuery.filter(_.id.isEmpty) join programsVwQuery on(_.id === _.id) 
     } yield (f.id) 
db.run(query.to[List].result) 
+0

你能解釋一下爲什麼它不起作用嗎?輸出是什麼? –

回答

0

首先你做了什麼的是不是一個LEFT JOIN(我正在談論Slick版本)。爲了生成它,你需要使用joinLeft方法。

但是這個簡單的修正是錯誤的 - 它產生子查詢這是壞的。

for { 
     (_, p) <- echoQuery.filter(_.id.isEmpty) 
       .joinLeft(programsVwQuery).on(_.id === _.id) 
} yield (p.map(_.id)) 

旁註: 記住上面pOption(它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,就是你剛開始時想要的。

+0

如何運行查詢? –

+0

查看我的更新回答 –

+0

謝謝。你的解決方案有效 雖然只有一個變化..我不得不使用如果e.map(_。id).isEmpty進行過濾。 –