我正在嘗試從Oracle RDBMS將視圖轉換爲SQL Server。該視圖的樣子:如何將包含START WITH ... CONNECT BY子查詢的視圖轉換爲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)
已經閱讀recursive CTE's,也對他們的use in sub-queries,在轉換到上述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關係數據庫管理系統運行到SQL Server 2008這個系統是一個比較大的基於Java EE的系統,使用JPA(休眠)查詢來自數據庫。
許多查詢使用上述視圖來限制返回適合當前用戶的結果。如果我無法直接轉換視圖,那麼轉換將變得更加困難,因爲我需要更改查詢數據庫的所有位置以獲得相同的結果。
由這種觀點所引用的表有類似的結構:
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,被分配到區域美國,用戶被分配到區域紐約,那麼用戶應該能夠看到的部分。
更新:我能夠通過創建一個單獨的視圖,包含必要的數據,然後讓我的主視圖加入此視圖解決錯誤。這有系統的工作,但我還沒有做徹底的正確性或性能測試。我仍然樂於提供更好的解決方案。
。或類似於http://stackoverflow.com/questions/12869048/hierarchy-query-sql-server-2008 – xQbert 2013-03-08 03:22:11
xQbert,感謝您的評論。我知道如何使用CTE在SQL Server中創建分層查詢。我非常希望按原樣轉換視圖,以避免在查詢數據庫時不得不修改大部分系統。我編輯了這個問題,希望能夠讓這個問題更清楚。 – 2013-03-08 03:34:36
我想你需要在cte中構建整棵樹,然後將結果限制在'IN'子句的子選擇中。順便說一句,在CTE遞歸部分的連接是錯誤的:它應該是'join region_structure'而不是'join region_relation' – 2013-03-08 08:19:10