我正在尝试将视图从 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 的引用的错误。
如何在 SQL Server 中获得与从 Oracle 视图中获得的结果相同的结果?
背景
我正在将一个系统从运行在 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 被分配到美国地区,而用户被分配到纽约地区,那么用户应该能够看到该零件。
更新:我能够通过创建一个包含必要数据的单独视图来解决该错误,然后让我的主视图加入该视图。这使系统正常工作,但我还没有进行彻底的正确性或性能测试。我仍然愿意接受有关更好解决方案的建议。