gpt4 book ai didi

scala - 光滑的 3 个多个外部连接

转载 作者:行者123 更新时间:2023-12-03 21:20:52 24 4
gpt4 key购买 nike

从 Slick 文档中,很清楚如何在两个表之间进行单个左连接。

val q = for {
(t, v) <- titles joinLeft volumes on (_.uid === _.titleUid)
} yield (t, v)

正如预期的那样,查询 q 将具有以下属性: _1类型 Titles_2类型 Rep[Option[Volumes]]覆盖不存在的卷。

进一步的级联是有问题的:
val q = for {
((t, v), c) <- titles
joinLeft volumes on (_.uid === _.titleUid)
joinLeft chapters on (_._2.uid === _.volumeUid)
} yield /* etc. */

这是行不通的,因为 _._2.uid === _.volumeUid给定 _.uid 无效不存在。

根据网络上的各种消息来源,这应该不是问题,但话又说回来,消息来源往往针对不同的光滑版本,而 3.0 仍然是相当新的。有没有人对这个问题有一些线索?
澄清一下,想法是使用两个左连接从 3 个级联 1:n:n 表中提取数据。
等效的 SQL 将是:
Select *
from titles
left join volumes
on titles.uid = volumes.title_uid
left join chapters
on volumes.uid = chapters.volume_uid

最佳答案

您的第二个左连接不再在 TableQuery[Titles] 上运行,而是实际上是 Query[(Titles, Option[Volumes])] (忽略结果和集合类型参数)。当您在 TableQuery[Chapters] 上加入结果查询时您可以使用 _2 访问元组中的第二个条目字段(因为它是 Option,您需要 map 才能访问 uid 字段):

val q = for {
((t, v), c) <- titles
joinLeft volumes on (_.uid === _.titleUid)
joinLeft chapters on (_._2.map(_.uid) === _.volumeUid)
} yield /* etc. */

避免 TupleN
如果 _N字段语法不清楚,也可以使用 Slick's capacity for user-defined record types或者映射您的行:
// The `Table` variant of the joined row representation
case class TitlesAndVolumesRow(title: Titles, volumes: Volumes)

// The DTO variant of the joined row representation
case class TitleAndVolumeRow(title: Title, volumes: Volume)

implicit object TitleAndVolumeShape
extends CaseClassShape(TitlesAndVolumesRow.tupled, TitleAndVolumeRow.tupled)

关于scala - 光滑的 3 个多个外部连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32061552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com