2017-04-12 4 views
0

가. 내가 구조 AS 함께 잘 알고 아닙니다.SQL 서버 근처의 구문이 잘못되었습니다 '('재귀 쿼리에 나는 SQL Server 쿼리에 IBM의 DB2 쿼리를 변환하려고

DB2 u 리를 (어떤 작품) 입니다 :

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

. 당신은 열 이름이 무엇인지 말할 것입니다, 그래서 당신은 타입 선언이나 캐스트가 필요 없습니다. – ps2goat

답변

3

이 시도 : 첫 번째 줄에 당신이 CTE의 열을 열거하기 때문에

;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 

당신은 첫 번째 줄에 명시 적 캐스트가 필요하지 않습니다, 당신은 등 자신의 데이터 타입이나 크기를 정의하지 않습니다 .

;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 Improved –

+0

감사합니다. – Argentina

3

common table expression의 열 목록이 아니오 :

당신은 완전히처럼, 당신의 CTE에 당신 별칭으로 한, CTE의 상단에있는 모든 열을 열 열거를 제거 할 수 그 값을 던지는 곳. 대신 '첫 번째 행에서 단지'로서 ZoneList (ID, 이름, PARENT_NAME, PARENT_ID, 레벨)와`parent_name`--을 사용 (VARCHAR (45) 등 (PARENT_NAME)) '의 캐스팅

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