【问题标题】:Can I do a NATURAL JOIN is Slick v2?我可以做一个 NATURAL JOIN 是 Slick v2 吗?
【发布时间】: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


    【解决方案1】:

    Slick 目前不支持。请提交工单或拉取请求。

    为了提高查询代码的可读性,您可以将连接条件放入可重用的值中。或者您可以将整个联接放在 Query[Suppliers,Supplier] 的函数或方法扩展中。

    或者,您可以查看此处http://slick.typesafe.com/docs/#20130612_slick_vs_orm_scaladays_2013 描述并在此处实现https://github.com/cvogt/play-slick/blob/scaladays2013/samples/computer-database/app/util/autojoin.scala 的 AutoJoin 模式(基本上使您的连接条件隐式)

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      相关资源
      最近更新 更多