3

ビューを 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 に割り当てられている場合、ユーザーはその部品を見ることができるはずです。

更新:必要なデータを含む別のビューを作成し、メイン ビューをこのビューに結合することで、エラーを回避することができました。これでシステムは動作しますが、完全な正確性やパフォーマンスのテストはまだ行っていません。私はまだより良い解決策の提案を受け付けています。

4

1 に答える 1