2012-11-27 6 views
0

: CTE를 행을 선택하고 이름을IBM DB2 9.7 공통 테이블 표현식 나는에 노력하고

  1. 갱신 CTE

내가 사용이 구현하고 해당 테이블에 대한 몇 가지 열 공통 테이블 식이지만 작동시키지 못합니다.

Begin 
With CTE AS 
(select * from MyTable where Column1 is null order by Column2 desc 
(Update CTE 
Set Column3= 1, Column4 = 1, Column5 = 1)) 
Commit; 

나는 DB2의 사양을 준수하려고 노력하지만, 여전히 가진 문제 :

+0

이것은 잠재적으로 사용자 DB2의 버전 (및 플랫폼)에 따라 달라지며 포함되어야합니다. 또한, CTE_에서 순서 지정에 의존하는 일종의 함수 (예 :'Fetch 1 ROW ONLY')를 사용하지 않는 한,'ORDER BY '는 나머지 쿼리에서 크게 무시 될 것이며, 잠재적으로 최적화 프로그램에서 제거 할 수 있습니다. 귀하의 답변과 관련하여 –

답변

1

일반적으로, CTE에 대한 구문은 더 다음과 같습니다. 괄호에주의하십시오.

With CTE AS 
(
    select * from MyTable where Column1 is null order by Column2 desc 
) 
Update CTE 
Set Column3= 1, Column4 = 1, Column5 = 1; 

this documentation은 CTE와 함께 UPDATE 문을 사용할 수 없다는 것을 나타냅니다.

fullselect 문을 가질 수있는 곳이면 어디든 공통 테이블 표현식을 정의 할 수 있습니다. 예를 들어 SELECT, INSERT, SELECT INTO 또는 CREATE VIEW 문에 공통 테이블 표현식을 포함 할 수 있습니다. 열팽창 계수가 업데이트 할 수 없습니다 경우


가능한 해결 방법

, 그냥 CTE를 제거하고 UPDATE 문을 작성합니다. ORDER BY가 필요하지 않습니다. 이것은 동등한 UPDATE 문과 같습니다.

update MyTable 
set ... 
where Column1 is null 
+0

이 CTE에 대한 업데이트가 불가능하다는 최종 결론이 있습니까? 그렇다면이 문제를 해결하기위한 아이디어가 있습니까? – user1340582

+0

아니요, DB2의 다른 버전이 다른 기능 세트를 가지고 있다고 생각하기 때문에 UPDATE가 불가능하다고 결론 내릴 수 없습니다. 버전 번호 만 다르지는 않지만, 메인 프레임 버전은 때때로 미드 레인지 버전과 i386 버전과 조금 다릅니다. (나는 그것에 대해 잘못 될 수 있습니다.) 그러나 게시 된 진술은 괄호 때문에 관계없이 작동하지 않습니다. CTE에 INSERT 할 수 있는지 테스트하십시오. INSERT는 최소한 내가 링크 된 페이지에 문서화되어 있습니다. 삽입 할 수는 있지만 업데이트 할 수 없다면, 당신의 대답이 있습니다. –

+0

UPDATE가 불가능한 것처럼 보입니다 ... 젠장, T-SQL로 할 수 있지만 PL-SQL에서는 할 수없는 일이 많이 있습니다 :) – user1340582

관련 문제