如何将以下Oracle Query转换为DB2。 Query在Oracle中运行良好,但在DB2中运行不正确。
Query:
Select f.folder_id, f.identifier
From FOLDER f, STOREENT se
Where f.type = 'AttributeFolder'
And se.storeent_id = f.storeent_id
And se.identifier = 'Global_CAS'
And f.identifier = 10051
connect by prior f.folder_id = f.parentfolder_id
start with f.identifier = 'Categories Descriptors [Global.B2C.Sales]'
感谢Ur的回复。我在环境中试过了同样的事情。我收到以下错误。你能帮助我出错吗?
查询:
使用cte as(选择folder_id,f.identifier,cast(null作为varchar(255))parentfolder_id,0作为深度,se.identifier作为se_identifier来自文件夹f join storeent se se.storeent_id = f.storeent_id其中f .identifier ='A'union all选择f.folder_id,f.identifier,f.parentfolder_id,cte.depth + 1作为深度,se.identifier作为se_identifier来自文件夹f join storeent se se.storeent_id = f.storeent_id join cte cte on f.parentfolder_id = cte.folder_id)从cte中选择parentfolder_id,folder_id,identifier,depth
java.sql.SQLSyntaxErrorException:语法错误:在第1行第1列遇到“with”。
答案 0 :(得分:2)
事实上,如果启用了Oracle兼容模式(db2set DB2_COMPATIBILITY_VECTOR=08
),DB2 for Linux,Unix和Windows v.9.7及更高版本支持这种Oracle专有语法,如下所述:{{3 }}
如果要迁移Oracle数据库应用程序,则可能需要通过在创建DB2之前将CONNECT BY
设置为DB2_COMPATIBILITY_VECTOR
来启用所有Oracle兼容性功能,而不仅仅是ORA
语法支持。数据库中。
答案 1 :(得分:1)
Connect by
和start with
是特定于Oracle的。要在DB2中实现类似的功能,请使用公用表表达式(CTE)(使用SQL Server进行测试,但也应该在DB2上运行):
with cte as (
select folder_id, f.identifier, cast(null as varchar(255)) parentfolder_id,
0 as depth,
se.identifier as se_identifier
from folder f
join storeent se on se.storeent_id = f.storeent_id
where f.identifier = 'A'
union all
select f.folder_id, f.identifier, f.parentfolder_id,
cte.depth + 1 as depth,
se.identifier as se_identifier
from folder f
join storeent se on se.storeent_id = f.storeent_id
join cte cte on f.parentfolder_id = cte.folder_id
)
Select parentfolder_id, folder_id, identifier, depth
from cte
CTE由两部分组成:
进一步阅读:IBM Developerworks article on migration Oracle tree queries to recursive CTE's