Название говорит само за себя. Используя 2.0.0-M3, я хотел бы избежать ненужной многословности — это форма явного именования столбцов, которые должны быть объединены, поскольку они имеют соответствующие имена и поскольку NATURAL JOIN
является частью стандарта SQL. Не говоря уже о том, что в самой Википедии даже говорится, что "Естественное соединение, возможно, является одним из самых важных операторов, поскольку оно является реляционным аналогом логического И."
Я думаю, что вышеизложенное должно быть достаточно ясно, но если нет, читайте дальше. Предположим, я хочу знать имя поставщика и номер детали каждой детали. Предполагая, что соответствующие классы случаев не показаны:
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?