2016-12-08 9 views
0

スレイクに初心者です。スカラは左に参加しません。

私は、programs_vwテーブルに存在しないエコーテーブルからidsのリストを取得したいと考えています。

私は

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

まず仕事doesntのしているが働くSQLクエリをされていない書かれていますLEFT JOIN(私はSlickバージョンについて話している)。生成するには、joinLeftメソッドを使用する必要があります。

しかし、この簡単な修正は間違っています。つまり、サブクエリが悪いです。

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

サイドノート: (それはすべての後に、LEFT JOINです)上記pOptionであることに留意してください。

修正し解決策は、このようなものになるだろう:

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

私の意見では良い兆候である - それは実際にはほとんどのSQLのように読み取ります。

完全に正しい解

は、上記のあなたは、サブクエリなしにしたい参加の種類を生成しますが、あなたの目的のクエリにそれを比較すれば、それは実際にあなたが目指しているものを生成しません。 Slickはしばしば私たちのSQLは、この(ご希望のバージョン)のようなものである場合よりも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

をチェックしてください。あなたのソリューションは機能します。 ただ1つだけ変更します。フィルタリングのためにe.map(_。id).isEmptyを使用する必要がありました。ありがとうございます。 –

関連する問題