【发布时间】:2013-11-18 05:51:58
【问题描述】:
标题是不言自明的。使用 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."
我认为上述内容应该足够清楚,但如果不是,请继续阅读。假设我想知道每个零件的供应商名称和零件编号。假设未显示适当的案例类:
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
应该返回一个带有我想要的数据的 Vector,但我在 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 中进行自然连接?
【问题讨论】:
标签: sql scala join slick relational-algebra