2016-12-11 4 views
0

私は2つのデータベース(database1とdatabase2)を持っています。Scala Slickを使用して、異なるデータベース(データソース)のテーブルにleftJoinを実行する方法は?

  • DATABASE1はフィールドIDでTABLE1があり
  • データベース2には、今私はleftJoinが(下図のように)実行するのですかフィールドID

とtable2のはスリック使用していますか?

SELECT tb1.`id` 
FROM `database1`.`table1` t1 
LEFT JOIN `database1`.`table2` t2 ON t1.`id`=t2.`id` 

答えて

4

ここで間違っているかもしれませんが、ほとんどの既存のリレーショナルデータベースでは、1回の操作で複数のデータベースにまたがることはできません。しかし、上に示した内容はschemaを使用することで簡単に達成できます(そして、これはあなたが本当に達成したいと強く信じています - あなたがペーストした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' 

:以下のSQLを生成します

DocumentTable 
     .joinLeft(StudentTable).on(_.studentId === _.id) 
     .filter { case(doc, student) => student.map(_.name) === "Test" } 

// 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] 

は、次のクエリを行う:さんは次のように我々はSlick関連のコード内で定義された2つのテーブルを持っていると仮定しましょう私のテーブル定義は:

class StudentTable(tag: Tag) extends Table[Student](tag, _schemaName = Option("database2"), "STUDENT") { 
... 
- - 特定のテーブルを指定されたスキーマを前置する必要があることを示し、私は一つのパラメータを追加し3210

この

class DocumentTable(tag: Tag) extends Table[Document](tag, _schemaName = Option("database1"), "DOCUMENT") { 
... 

注意。私が持っているだろう

は(同じスリッククエリ)は、次の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' 

あなたが達成したいものを正確にします。

関連する問題