【发布时间】:2017-04-12 14:52:05
【问题描述】:
我正在尝试将 IBM db2 查询转换为 SQL Server 查询。我对 WITH AS 构造不是很熟悉。
db2 查询(有效)是:
with ZoneList (id, name, parent_name, parent_id, level) as
(select id, name, '', parent_id, 1 as level
from products.zones where id = 1
union all
select z.id, z.name, l.name, z.parent_id, level + 1
from products.zones z, ZoneList l
where z.parent_id = l.id)
select id, name || ' (' || parent_name || ')' as description
from ZoneList
where level = 4
order by ZoneList.name
而我的 SQL Server 版本是:
with ZoneList (id, name, cast((parent_name) as varchar(45)), parent_id,
level) as
(select id, name, cast(('') as varchar(45)), parent_id, 1 as level
from products.zones where id = 1
union all
select z.id, z.name, cast((l.name) as varchar(45)), z.parent_id, level + 1
from products.zones z, ZoneList l
where z.parent_id = l.id)
select id, name + ' (' + parent_name + ')' as description
from ZoneList
where level = 4
order by ZoneList.name
为了避免不兼容类型错误,我添加了强制转换,但现在我在 '(' 附近出现语法错误。
【问题讨论】:
-
而不是第一行的
cast((parent_name) as varchar(45)),只需使用parent_name--with ZoneList (id, name, parent_name, parent_id, level) as。你说的是列名是什么,所以你不需要类型声明或强制转换。
标签: sql sql-server common-table-expression recursive-query