Название не требует пояснений. Использование 2.0.0-M3, я бы хотел избежать ненужной многословности, это форма явного называния столбцов, к которым нужно объединить, поскольку они соответствующим образом названы, а так как NATURAL JOIN
является частью стандарта SQL. Не говоря уже о том, что сама Википедия даже говорит, что "The natural join is arguably one of the most important operators since it is the relational counterpart of logical AND."Могу ли я сделать NATURAL JOIN - это Slick v2?
Я думаю, что вышеизложенное должно быть достаточно ясным, но если нет, читайте дальше. Предположим, я хочу знать имя поставщика и его номер для каждой части. Предполагая, что соответствующие классы регистра не показаны:
class Suppliers(tag: Tag) extends Table[Supplier](tag, "suppliers") {
def snum = column[String]("snum")
def sname = column[String]("sname")
def * = (snum, sname) <> (Supplier.tupled, Supplier.unapply _)
}
class Shipments(tag: Tag) extends Table[Shipment](tag, "shipments") {
def snum = column[String]("snum")
def pnum = column[String]("pnum")
def * = (snum, pnum) <> (Shipment.tupled, Shipment.unapply _)
}
val suppliers = TableQuery[Suppliers]
val shipments = TableQuery[Shipments]
Учитывая, что обе таблицы имеют snum
столбец, я хочу присоединиться на, кажется, как будто
(suppliers join shipments).run
должен возвращать вектор с моими нужными данными, но я получить неудачную попытку на INNER JOIN
, сбой (во время выполнения), так как отсутствует какое-либо условие соединения.
Я знаю, что могу сделать
suppliers.flatMap(s => shipments filter (sp => sp.snum === s.snum) map (sp => (s.sname, sp.pnum)))
, но даже без имен всех столбцов я для ясности этого вопроса, он по-прежнему довольно много более типирование (и корректура), чем просто
suppliers join shipments
или, по этому вопросу
SELECT * FROM suppliers NATURAL JOIN shipments;
Если код Scala является хаотичным, чем SQL кода, то я действительно начинаю задавать вопросы. Нет ли способа сделать естественное соединение в Slick?