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パターンを試してみました。
- database1のテーブルとdatabase2のテーブルでJOINする
- 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); }