ビューを Oracle RDBMS から SQL Server に変換しようとしています。ビューは次のようになります。
create or replace view user_part_v
as
select part_region.part_id, users.id as users_id
from part_region, users
where part_region.region_id in(select region_id
from region_relation
start with region_id = users.region_id
connect by parent_region_id = prior region_id)
再帰的な CTEについて、およびサブクエリでのそれらの使用について読んだ後、上記を SQL Server 構文に変換するための最良の推測は次のとおりです。
create view user_part_v
as
with region_structure(region_id, parent_region_id) as (
select region_id
, parent_region_id
from region_relation
where parent_region_id = users.region_id
union all
select r.region_id
, r.parent_region_id
from region_relation r
join region_structure rs on rs.parent_region_id = r.region_id
)
select part_region.part_id, users.id as users_id
from part_region, users
where part_region.region_id in(select region_id from region_structure)
明らかに、これにより、CTE 定義の users.region_id への参照に関するエラーが発生します。
Oracle ビューから取得したのと同じ結果を SQL Server で実現するにはどうすればよいですか?
バックグラウンド
私は、Oracle 11g RDMS で実行されているシステムから SQL Server 2008 へのシステムの変換に取り組んでいます。このシステムは比較的大規模な Java EE ベースのシステムであり、JPA (Hibernate) を使用してデータベースからクエリを実行します。
クエリの多くは、上記のビューを使用して、返される結果を現在のユーザーに適したものに制限します。ビューを直接変換できない場合、同じ結果を得るためにデータベースにクエリを実行するすべての場所を変更する必要があるため、変換ははるかに困難になります。
このビューが参照するテーブルは、次のような構造になっています。
USERS
ID
REGION_ID
REGION
ID
NAME
REGION_RELATIONSHIP
PARENT_REGION_ID
REGION_ID
PART
ID
PARTNO
DESCRIPTION
PART_REGION
PART_ID
REGION_ID
したがって、階層に配置されたリージョンがあります。ユーザーを地域に割り当てることができます。パーツは、多くの領域に割り当てられている場合があります。ユーザーは、自分の地域に割り当てられた部品のみを表示できます。地域はさまざまな地理的地域を参照します。
World
Europe
Germany
France
...
North America
Canada
USA
New York
...
部品 #123 が地域 USA に割り当てられ、ユーザーが地域 New York に割り当てられている場合、ユーザーはその部品を見ることができるはずです。
更新:必要なデータを含む別のビューを作成し、メイン ビューをこのビューに結合することで、エラーを回避することができました。これでシステムは動作しますが、完全な正確性やパフォーマンスのテストはまだ行っていません。私はまだより良い解決策の提案を受け付けています。