まず仕事doesntのしているが働くSQLクエリをされていない書かれていますLEFT JOIN(私はSlickバージョンについて話している)。生成するには、joinLeft
メソッドを使用する必要があります。
しかし、この簡単な修正は間違っています。つまり、サブクエリが悪いです。
for {
(_, p) <- echoQuery.filter(_.id.isEmpty)
.joinLeft(programsVwQuery).on(_.id === _.id)
} yield (p.map(_.id))
サイドノート: (それはすべての後に、LEFT JOINです)上記p
がOption
であることに留意してください。
修正し解決策は、このようなものになるだろう:
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を見てみれば、まさにあなたが最初に望んでいたものです。
もう少し詳しく説明してもらえませんか?出力は何ですか? –