2017-04-12 89 views
0

我試圖將IBM DB2查詢轉換爲SQL Server查詢。我不是很熟悉與AS結構。SQL Server的附近有語法錯誤('在遞歸查詢

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 

我爲了避免不兼容類型的錯誤增加了石膏,但現在我得到語法錯誤附近「(」

+0

,而不是'投((PARENT_NAME)爲varchar(45))'在第一線,只需用''parent_name'--與ZoneList(ID,姓名,PARENT_NAME,PARENT_ID, 級)爲' 。你說什麼列名將是,所以你不需要類型聲明或演員。 – ps2goat

回答

3

試試這個:

;with ZoneList (id, name, parent_name, 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 
     inner join ZoneList l 
      on z.parent_id = l.id 
    ) 
select id 
    , name + ' (' + parent_name + ')' as description 
from ZoneList 
where level = 4 
order by ZoneList.name 

你不需要任何顯式轉換在第一線,因爲在第一行,你枚舉CTE的列,你沒有定義自己的數據類型或大小等。

你甚至可能完全在CTE的頂部在你的CTE刪除該列枚舉,只要你的別名每一列,如:

;with ZoneList 
as (
    select id 
     , name 
     , cast('' as varchar(45)) as [parent_name] 
     , parent_id 
     , 1 as level 
    from products.zones 
    where id = 1 

    union all 

    select z.id 
     , z.name 
     , cast(l.name as varchar(45)) as [parent_name] 
     , z.parent_id 
     , level + 1 
    from products.zones z 
     inner join ZoneList l 
      on z.parent_id = l.id 
    ) 
select id 
    , name + ' (' + parent_name + ')' as description 
from ZoneList 
where level = 4 
order by ZoneList.name 
+1

我也建議將隱式連接更改爲顯式連接。 –

+0

@ZoharPeled改進 –

+0

謝謝,它的工作! – Argentina

3

common table expression列清單是不t你會在哪裏投出這個價值。

with ZoneList (id, name, parent_name, parent_id, level) as (
select 
    id 
    , name 
    , cast(('') as varchar(45)) as parent_name 
    , parent_id 
    , 1 as level 
from products.zones where id = 1 

union all 

select 
    z.id 
    , z.name 
    , cast((l.name) as varchar(45)) as parent_name 
    , z.parent_id 
    , level + 1 
from products.zones z 
    inner join ZoneList l 
    on z.parent_id = l.id 
) 
select 
    id 
    , name + ' (' + parent_name + ')' as description 
from ZoneList 
where level = 4 
order by ZoneList.name 
+2

我也建議將隱式連接更改爲顯式連接。 –

+0

@ZoharPeled良好的捕獲 – SqlZim