Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

【AWS】RedshiftではDatabaseをまたいだJOINはできない

Redshiftでは、DatabaseをまたいだJOINはできません。

※本記事は、2017/2/17時点の情報です。

こちらのAWSフォーラムにQAがありました。

https://forums.aws.amazon.com/message.jspa?messageID=453512

  • 質問者

    As I found out, cross-database reference in the Redshift is not supported:select * from database.schema.teble

訳:私が見たところでは、RedshiftではDBをまたいだ参照ができません。select * from database.schema.teble

  • AWSの回答者

    Redshift currently does not support this.

訳:Redshiftは現在これをサポートしていません。

検証

検証してみました。コードを書いて、次の2パターンを試してみました。

  1. database1のテーブルとdatabase2のテーブルでJOINする
  2. Dasebaseを指定せずに接続する

1. database1のテーブルとdatabase2のテーブルでJOINする

database1に接続し、database1のテーブルとdatabase2のテーブルでJOINするクエリを実行したところ、エラーが発生しました。

  • エラー内容 ERROR [0A000] [Amazon][Amazon Redshift] (30) Error occurred while trying to execute a query: [SQLState 0A000] ERROR: cross-database reference to database "database2" is not supported

  • 検証コード

try {
    const string ConnectionString = "Driver={Amazon Redshift (x86)};" +
        "Server=examplecluster.XXX.redshift.amazonaws.com;" +
        "Database=database1;UID=XXX;PWD=***;Port=5439;";

    const string Sql = "select c_custkey from database1.public.customer inner join database2.public.customer on c_custkey";

    using (OdbcConnection conn = new OdbcConnection(ConnectionString))
    using (OdbcDataAdapter da = new OdbcDataAdapter(Sql, conn)) {
        conn.Open();

        DataTable dt = new DataTable();

        // クエリの実行でエラー
        da.Fill(dt);
        Console.WriteLine(dt.Rows[0].Field<string>("c_custkey"));
    }
} catch (Exception ex) {
    Console.Error.WriteLine(ex.Message);
}

2. Databaseを指定せずに接続する

Database指定なしの接続文字列で試したところ、ConnectionオブジェクトのOpenでエラーが発生し、接続できませんでした。

  • エラー内容 ERROR [08001] [Amazon][ODBC] (10380) Unable to establish a connection with data source. Missing settings: {[Database]}

  • 検証コード

try {
    // DBを指定しない接続文字列
    const string ConnectionString = "Driver={Amazon Redshift (x86)};" +
        "Server=examplecluster.XXX.redshift.amazonaws.com;" +
        "UID=XXX;PWD=***;Port=5439;";

    const string Sql = "select c_custkey from database1.public.customer;";

    using (OdbcConnection conn = new OdbcConnection(ConnectionString ))
    using (OdbcDataAdapter da = new OdbcDataAdapter(Sql, conn)) {
        // 接続でエラー
        conn.Open();

        DataTable dt = new DataTable();
        da.Fill(dt);
        Console.WriteLine(dt.Rows[0].Field<string>("c_custkey"));
    }
} catch (Exception ex) {
    Console.Error.WriteLine(ex.Message);
}