Я использую scala 2.11, slick 2.1.0 и postgres 9.6.Об обновлении основной версии не может быть и речи.
У меня есть 2 идентичные таблицы (созданные из той же модели), и я хочу сделать исключающее соединение (левое внешнее соединение с нулем):
Моя модель выглядит следующим образом:
trait Coffee {
val coffeeLoversId: Option[Int]
val taxId: Option[Long]
val internationalCoffeeId: String
val providerId: String
}
class Coffees(tag: Tag, schema: String) extends Table[Coffee](tag, Some(schema), "coffees")
val coffeeLoversId: Column[Option[Int]] = column[Option[Int]]("coffee_lovers_id")
val taxId: Column[Option[Long]] = column[Option[Long]]("tax_id")
val internationalCoffeeId: Column[String] = column[String]("international_coffee_id", O.DBType("VARCHAR"))
val providerId: Column[String] = column[String]("provider_id", O.DBType("VARCHAR"))
def * = (coffeeLoversId, taxId, internationalCoffeeId, providerId) <> (Coffee.tupled, Coffee.unapply)
def ? = (coffeeLoversId, taxId, internationalCoffeeId.?, providerId.?).shaped.<>({r=>import r._; _1.map(_=> Coffee.tupled((_1, _2, _3.get, _4.get)))}, (_:Any) => throw new Exception("Inserting into ? projection not supported."))
}
object Coffees {
def tableQuery(implicit schema: TableSchema) = TableQuery[Coffees]{ tag : Tag => new Coffees(tag, schema.name) }
}
SQL-запрос, который я хотел бы выполнить:
SELECT * from previous.coffees PRV
LEFT JOIN current.coffees CUR
ON PRV.international_coffee_id = CUR.international_coffee_id
WHERE PRV.international_coffee_id IS NULL;
Я смог пройти так далекоas:
for {
(c,s) <- Coffees.tableQuery(previousSchema).leftJoin(
Coffees.tableQuery(currentSchema)
) on((x,y) => x.internationalCoffeeId === y.internationalCoffeeId)
} yield(c)
, который, кажется, дает мне левое внешнее соединение, но у меня возникают проблемы с фильтрацией на нулевой стороне сервера (добавление WHERE PRV.international_coffee_id IS NULL
)
Я буду благодарендля любых указателей или идей.