2012-08-09 3 views
2

다음 SQL 문을 사용하여 #temp 임시 테이블을 Sybase 15 데이터베이스의 최신 패키지 버전 번호로 간단히 업데이트 할 수 있습니다. 나 (더베이스보다는 주로 오라클 & SQL 서버 환경)으로하위 쿼리 파생 테이블 오류로 업데이트

UPDATE t 
SET versionId = l.latestVersion 
FROM #temp t INNER JOIN (SELECT gp.packageId 
           , MAX(gp.versionId) latestVersion 
         FROM Group_Packages gp 
         WHERE gp.groupId IN (SELECT groupId 
               FROM User_Group 
               WHERE userXpId = 'someUser') 
         GROUP BY gp.packageId) l 
ON t.packageId = l.packageId 

이 문을 조금 잘못이있다. 그러나 Sybase는 예외를 throw합니다.

You cannot use a derived table in the FROM clause of an UPDATE or DELETE statement. 

이제는 문제가 발생하지 않습니다. 나는 집계/GROUP BY를 사용하고 있기 때문에 그것이라고 가정합니다. 물론 임시 테이블에 하위 쿼리를 넣고 조인 할 수는 있지만 '올바른'방법이 무엇인지, 무엇이 잘못되었는지를 알고 싶습니다.

모든 아이디어 나 지침을 주시면 감사하겠습니다.

답변

0

:

나는 당신이 시작하려는 생각합니다. 아마 당신은 다음과 같이 다시 작성할 수 있습니다 : SYBASE 클래스에서 업데이트에서 중첩 된 쿼리를 지원하지 않는 것 같습니다

UPDATE t 
SET t.versionId = l.versionId 
FROM #temp t 
    INNER JOIN 
    Group_Packages l 
     ON t.packageId = l.packageId 
WHERE 
    l.groupId IN (SELECT groupId 
        FROM User_Group 
        WHERE userXpId = 'someUser') 
    AND 
    l.versionId = 
     (SELECT MAX(gp.versionId) 
      FROM Group_Packages gp 
      WHERE gp.groupId IN (SELECT groupId 
           FROM User_Group 
           WHERE userXpId = 'someUser') 
      AND gp.packageId = l.packageId 
     ) ; 
+1

그 중 하나 인 것 같습니다. 고맙습니다. 작은 수정을해야했습니다 :'UPDATE t'에서'UPDATE # temp'까지. 그렇게 간단한 것을 그런 식으로 써야한다는 것을 좌절시키는 것! – markblandford

+0

@valexhome이 짧은 버전을 제안했다고 생각합니다. –

0

#temp에 대한 테이블 별칭을 "t"라고하고 원래 테이블의 이름을 "t"로 지정합니다.

내 생각 엔 이것이 문제입니다. UPDATEFROM 절에 나는이 (파생 ​​테이블 허용하지 않는)베이스의 제한 추측

update #temp 
3

.

UPDATE #temp 
SET versionId = (SELECT MAX(gp.versionId) latestVersion 
         FROM Group_Packages gp 
         WHERE gp.packageId=#temp.packageId 
           and 
           gp.groupId IN (SELECT groupId 
               FROM User_Group 
               WHERE userXpId = 'someUser') 

         ) 

또한 l.latestVersion이 NULL 어떤 경우에는이를 사용하는 Similar problem

시도? #temp를 null로 업데이트 하시겠습니까? 그렇지 않다면 다음을 추가하십시오 :

WHERE (SELECT MAX(gp.versionId) 
          .... 
           ) is not null