如何使用Scala Slick对来自不同数据库(数据源)的表执行leftJoin? [英] How to perform leftJoin on tables from different databases(data sources) using Scala Slick?
本文介绍了如何使用Scala Slick对来自不同数据库(数据源)的表执行leftJoin?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有两个数据库(数据库1和数据库2)。
- 数据库%1具有字段ID为Table1的
- 数据库%2具有字段ID为Table2的
现在如何使用slick执行leftJoin(如下所示)?
SELECT tb1.`id`
FROM `database1`.`table1` t1
LEFT JOIN `database1`.`table2` t2 ON t1.`id`=t2.`id`
推荐答案
我在这里可能错了,但大多数现有关系数据库不允许您在单个操作中跨越多个数据库。然而,通过使用schema
可以很容易地实现上面展示的内容(我坚信这才是您真正想要实现的--从您粘贴的SQL来判断)。
让我们举个例子。假设我们在Slick
相关代码中定义了两个表,如下所示:
// student
case class Student(name: String,
middleName: Option[String],
surname: String,
nationality: String,
id: Id[Student] = Id.none)
class StudentTable(tag: Tag) extends Table[Student](tag, "STUDENT") {
def name = column[String]("NAME")
def middleName = column[Option[String]]("MIDDLE_NAME")
def surname = column[String]("SURNAME")
def nationality = column[String]("NATIONALITY")
def id = column[Id[Student]]("ID", O.PrimaryKey, O.AutoInc)
def * = (name, middleName, surname, nationality, id) <> (Student.tupled, Student.unapply)
}
lazy val StudentTable = TableQuery[StudentTable]
// document
case class Document(studentId: Option[Id[Student]],
name: String,
uuid: String,
id: Id[Document] = Id.none)
class DocumentTable(tag: Tag) extends Table[Document](tag, "DOCUMENT") {
def studentId = column[Option[Id[Student]]]("STUDENT_ID")
def name = column[String]("NAME")
def uuid = column[String]("UUID")
def id = column[Id[Document]]("ID", O.PrimaryKey, O.AutoInc)
def * = (studentId, name, uuid, id) <> (Document.tupled, Document.unapply)
def student = foreignKey("fk_document_student", studentId, StudentTable)(_.id.?)
}
lazy val DocumentTable = TableQuery[DocumentTable]
执行以下查询:
DocumentTable
.joinLeft(StudentTable).on(_.studentId === _.id)
.filter { case(doc, student) => student.map(_.name) === "Test" }
将生成以下SQL:
select x2."STUDENT_ID", x2."NAME", x2."UUID", x2."ID", x3."NAME", x3."MIDDLE_NAME", x3."SURNAME", x3."NATIONALITY", x3."ID"
from "DOCUMENT" x2
left outer join "STUDENT" x3 on x2."STUDENT_ID" = x3."ID"
where x3."NAME" = 'Test'
如果我将表定义更改为:
class StudentTable(tag: Tag) extends Table[Student](tag, _schemaName = Option("database2"), "STUDENT") {
...
和这个
class DocumentTable(tag: Tag) extends Table[Document](tag, _schemaName = Option("database1"), "DOCUMENT") {
...
请注意,我添加了一个参数_schemaName
,该参数指示特定表应该以指定的架构为前缀。
我现在将生成(相同的巧妙查询)以下SQL:
select x2."STUDENT_ID", x2."NAME", x2."UUID", x2."ID", x3."NAME", x3."MIDDLE_NAME", x3."SURNAME", x3."NATIONALITY", x3."ID"
from "database1"."DOCUMENT" x2
left outer join "database2"."STUDENT" x3 on x2."STUDENT_ID" = x3."ID"
where x3."NAME" = 'Test'
这似乎正是您要实现的。
这篇关于如何使用Scala Slick对来自不同数据库(数据源)的表执行leftJoin?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文