Я использую Slick versio 2.0.0-M3. Если у меня два Query
s, представляющие отношения одного и того же типа, я вижу, что есть оператор union
, чтобы включить их в разъединение, но я не вижу сопоставимого оператора для получения их пересечения или их разности. Не существуют ли такие операторы в Slick?Могу ли я получить реляционное пересечение или разницу с помощью Slick 2?
Я думаю, что вышеизложенное объясняет, что я ищу, но если нет, вот пример. Я имею поставщиков таблицы:
case class Supplier(snum: String, sname: String, status: Int, city: String)
class Suppliers(tag: Tag) extends Table[Supplier](tag, "suppliers") {
def snum = column[String]("snum")
def sname = column[String]("sname")
def status = column[Int]("status")
def city = column[String]("city")
def * = (snum, sname, status, city) <> (Supplier.tupled, Supplier.unapply _)
}
val suppliers = TableQuery[Suppliers]
Если я хочу знать о поставщиках, которые либо находятся в определенном городе или имеют особый статус, я вижу, как использовать Query.union
для этого:
scala> val thirtySuppliers = suppliers.filter(_.status === 30)
thirtySuppliers: scala.slick.lifted.Query[Suppliers,Suppliers#TableElementType] = [email protected]
scala> val londonSuppliers = suppliers.filter(_.city === "London")
londonSuppliers: scala.slick.lifted.Query[Suppliers,Suppliers#TableElementType] = [email protected]
scala> (thirtySuppliers union londonSuppliers).foreach(println)
Supplier(S1,Smith,20,London)
Supplier(S4,Clark,20,London)
Supplier(S3,Blake,30,Paris)
Supplier(S5,Adams,30,Athens)
Нет проблема. Но что, если я хочу только поставщиков, которые являются и в определенном городе и имеют особый статус? Кажется, как будто я должен быть в состоянии сделать что-то вроде:
(thirtySuppliers intersect londonSuppliers).foreach(println)
Или если я хочу поставщиков в конкретном городе кроме те, которые имеют особый статус. Могу ли я не делать что-то вроде:
(thirtySuppliers except londonSuppliers).foreach(println)
SQL имеет UNION
, INTERSECT
и EXCEPT
операции, и Query
класс Slick имеет в union
метод, который строит запрос SQL с помощью SQL-х UNION
, но я не вижу Query
методы Slick для получения пересечений и различий. Я скучаю по ним?
То, что вы говорите, истинно в этом случае, так как мои два отношения операндов являются ограничениями одной и той же базовой таблицы. Тем не менее, я заинтересован в возможности выполнять операции в общем случае любых двух запросов Query (с соответствующими столбцами). Возможно, в моем примере я должен был использовать две отдельные базовые таблицы. –