前提・実現したいこと
現在、Oracleに向けているシステムを、PostgreSQL用に設計し直すという作業をしています。
そのため、システムが発行しているSQLクエリを、PostgreSQLに書き直しているのですが、どうすれば良いのか分からないSQLがあり、それについて質問させていただければと思います。
発生している問題
以下のようなOracleの外部結合(+)を使って、色々と結合させているSQLがあります。
sql
1select 2 a.column_1 as DATA01 3 b.column_3 as DATA02 4 c.column_7 as DATA03 5 d.column_2 as DATA04 6from 7 AA as a, 8 BB as b, 9 (select .... from CC) as c, 10 (select .... from DD) as d 11where 12 a.column_3 = c.column_3(+) 13 a.column_4 = c.column_4(+) 14 , b.column_3 = c.column_3(+) 15 , c.column_3 = d.column_3(+) 16 , c.column_4 = d.column_4(+) 17 , c.column_6 < 21
このSQLは、このように、from句で副問合せが使われたテーブルを、外部結合で何度も利用しています(「c」とエイリアスが付けられた副問合せが、where句で、いくつも結合に使用されている事を意味します)。
これをPostgreSQLなどで動く、普通の外部結合(LEFT OUTER JOIN)を使って書き直すには、どうすれば良いのか、分かりますでしょうか?
試したこと
一応、以下のように書いてみましたが、(案の定というか当たり前ですが)同じエイリアスは設定できないと怒られてしまいます。
sql
1select 2 a.column_1 as DATA01 3 b.column_3 as DATA02 4 c.column_7 as DATA03 5 d.column_2 as DATA04 6from 7 AA as a LEFT OUTER JOIN (select .... from CC) as c on a.column_3 = c.column_3 8 LEFT OUTER JOIN (select .... from CC) as c on a.column_3 = c.column_3 9 , BB as b LEFT OUTER JOIN (select .... from CC) as c on b.column_3 = c.column_3 10 ...... 11 ...... 12 ...... 13where 14 c.column_6 < 21
以下のように、それぞれエイリアスを異なる名前にすると、エラーは起きなくなりますが、やはり出力されるデータは、元のSQLと異なってしまいますよね?
sql
1select 2 a.column_1 as DATA01 3 b.column_3 as DATA02 4 c.column_7 as DATA03 5 d.column_2 as DATA04 6from 7 AA as a LEFT OUTER JOIN (select .... from CC) as c_01 on a.column_3 = c_01.column_3 8 LEFT OUTER JOIN (select .... from CC) as c_02 on a.column_3 = c_02.column_3 9 , BB as b LEFT OUTER JOIN (select .... from CC) as c_03 on b.column_3 = c_03.column_3 10 ...... 11 ...... 12 ...... 13where 14 c_01.column_6 < 21
出力結果をOracleのときと同じにするために、どうにか、「エイリアスを設定している副問合せ」を、「c」のエイリアスは維持したまま、使い回せるような書き方をしたいのですが、うまいSQLが思いつきません。
何か案はありますでしょうか?
回答3件
あなたの回答
tips
プレビュー