2012-05-22 7 views
0

나는이 합류 : 당신이 볼 수 있듯이결합 계산이 작동하지 않습니까?

UPDATE Table_Name 
SET Change = isnull(tab2.Value,0) - tab1.Value 
FROM 
    (SELECT Date,ID,ID,FileName,Value FROM Table_Name WHERE FileName = 'x' AND Date = '2012-05-17') tab1 
LEFT OUTER JOIN 
    (SELECT Date,ID,TradeID,FileName,Value FROM Table_Name WHERE FileName = 'x' AND Date = '2012-05-18') tab2 
ON tab1.FileName = tab2.FileName AND 
tab1.ID = tab2.ID AND 
tab1.ID = tab2.ID 

, 그것은 왼쪽 외부 조인입니다. 그러나 5 월 17 일 데이터가 있고 5 월 18 일 데이터가없는 경우 삽입 된 값은 -17 번째 값이어야합니다 (일반 계산은 18 번째이므로 값 - 17 번째. 값과 18 번째. 값은 0입니다).

삽입 부분 (디버깅 용) 바로 아래에 select 문을 넣으면 올바르게 표시되지만 SELECT 문을 제거하고 SET 부분에서 계산을 수행하면 올바르게 작동하지 않습니다. 나는 Change of null의 값으로 끝난다. 여기서 5 월 18 일에 대한 일치가 발견되지 않았다.

편집 : LEFT JOIN 또는 LEFT OUTER JOIN이 필요한지 불확실합니다. tab1에서 모든 행을 반환하고 tab2에 존재하지 않으면 변경 값은 tab2.Value - tab1.Value와는 반대로 -tab1.Value 여야합니다.

+0

두 번째가 아닌 첫 번째 값에 대한 ISNULL 검사를 수행하고 있는데 문제가 될 수 있습니까? –

+0

@PaulMcCowat'EXISTS'는 그 테이블에서 값을 다시 가져올 수 없습니다. 그는'JOIN' 테이블이 아닌 소스 테이블이기 때문에 두번째 필드에'NULL'을 가지지 않을 것입니다. – JNK

+0

'tab2.value'가'NULL' 인 계산을 위해 어떤 값을 얻고 있습니까? – JNK

답변

0

DB2는 UPDATE (또는 DELETE)에 주 테이블 참조 절에 조인을 포함 할 수 없으므로 어떤 유형의 문제점을 방지 할 수 있습니다. 예, 저는 SQL Server를 사용하고 있다는 것을 알고 있습니다. 이것이 당신이 시도한 이유입니다. DB2 제약 조건을 염두에두고 작성하는 경향이 있습니다.

17 번째 행을 업데이트한다고 가정하면 다음과 같이 처리해야한다고 생각합니다. 그렇지 않으면 실제로 업데이트 할 행을 지정하십시오.

UPDATE Table_Name 
SET change = -value + COALESCE((SELECT nxt.value 
           FROM Table_Name nxt 
           WHERE nxt.fileName = table_name.fileName 
           AND nxt.id = table_name.id 
           AND nxt.scenarioId = table_name.scenarioId 
           AND nxt.cobDate = '2012-05-18'), 0) 
WHERE fileName = 'GBP.csv' 
AND cobDate = '2012-05-17' 


편집 : 위의 대한 수정 된 오류.

그러나 ... 사물의 소리에서 이없는 행을 업데이트하려고 시도했을 수 있습니다.; 구체적으로 '결과는 18 일에 입력해야합니다.' 만약 당신이하고있는 일이 존재하는 18 번째 줄을 업데이트하려고하거나, 그렇지 않으면 삽입하지 않으면 두 문장 (또는 어쩌면 MERGE?)을 필요로 할 것입니다. 버전은, 그래서) 그와 함께 당신을 도울 수 없습니다

UPDATE Table_Name 
SET change = value - COALESCE((SELECT prev.value 
           FROM Table_Name prev 
           WHERE prev.fileName = table_name.fileName 
           AND prev.id = table_name.id 
           AND prev.scenarioId = table_name.scenarioId 
           AND prev.cobDate = '2012-05-17'), 0) 
WHERE fileName = 'GBP.csv' 
AND cobDate = '2012-05-18'; 

INSERT INTO Table_Name (id, scenarioId, fileName, cobDate, value, change) 
         SELECT id, scenarioId, fileName, '2012-05-18', 0, -value 
         FROM Table_Name 
         WHERE fileName = 'GBP.csv' 
         AND cobDate = '2012-05-17' 
         AND NOT EXISTS (SELECT '1' 
             FROM Table_Name nxt 
             WHERE nxt.fileName = table_name.filename 
             AND nxt.id = table_name.id 
             AND nxt.scenarioId = table_name.scenarioId 
             AND nxt.cobDate = '2012-05-18'); 

당신 MUST이 순서 그들에게 를 실행합니다.
당신 는 또한관련 데이터가 포함 된 행이 (INSERT 에디션, UPDATE D, DELETE d)를 수정되지 않도록하기 위해 다른 방법을 가지고 모두 문장의 결합 실행을위한 테이블을 잠 그거나 수 있어야한다 어떤 행이 이 아니고이 아닌 행을 알 수 있습니다.

원하는 동작이 아니라면 수행하려는 작업을보다 명확하게 수정하십시오.

+0

안녕 Z-Zero, '원본으로'및 ', 0'구문에 약간의 문제가있는 것 같습니다 (후자는 이전 오류의 결과 일 수 있음)? – mezamorphic

+0

오류에 대해서는 COALESCE 이후에 괄호가 누락되어 '출처로'작동하지 못했습니다. 나는 "기원"을 바꿨다. 이 "Table_Name". – mezamorphic

+0

나는 이것이 내가 찾는 것을 생각하지 않는다. 빼기 결과는 실제로 18 일에 입력해야하며 강조는 LEFT JOIN에 입력해야합니다. 나는 당신의 SQL 편집을 시도했으나 그렇게 할 수 없었다. 아마 실수했을 것이다. – mezamorphic

관련 문제