2017-03-29 2 views
0

임시 테이블에 데이터가 있고 다른 두 테이블에서 중복을 검사하고 있습니다. 발견 된 모든 중복에 대한 임시 테이블 (SET DupFlag = TRUE)에 플래그를 설정하려고합니다. 내 SELECT 문은 완벽하게 작동하여 테스트를 위해 입력 한 48 개의 중복 만 반환합니다. 그러나 UPDATE 및 WHERE EXISTS를 추가하면 idTempImport2의 모든 레코드는 SELECT 문에서 반환 된 48 개의 레코드 대신 TRUE로 설정됩니다. 내 구문이 잘못 되었습니까? 다음과 같이 보입니다 :WHERE EXISTS가 포함 된 내 UPDATE 문은 SELECT 문 결과로 제한되지 않습니다.

UPDATE idTempImport2 as tmp2 SET DupFlag = TRUE 
WHERE EXISTS 
(SELECT * FROM idTempImport2 tmp2 
LEFT JOIN (SELECT im.idDate, im.UserID, im.ActionID, im.IsHC, idn.Epic1, idn.Epic2 
     FROM idMain AS im 
     INNER JOIN idNotes AS idn ON im.aID = idn.MainID 
    WHERE idDate BETWEEN "2017-01-02" AND "2017-01-31") AS qry 
ON qry.idDate = tmp2.idDate AND qry.UserID = tmp2.UserID AND qry.ActionID = tmp2.ActionID AND qry.Epic1 = clng(tmp2.Epic1) AND qry.Epic2 = clng(tmp2.Epic2) 
WHERE qry.Epic1 <> NULL); 
+1

당신은 그 null로 전달합니다 존재 알고있다? http://www.techrepublic.com/article/oracle-tip-understand-how-nulls-affect-in-and-exists/ http://stackoverflow.com/questions/5658457/not-equal-operator -non – user2184057

+0

qry.Epic1 <> NULL 여기에 NULL이있는 평등 <> =! = 연산자를 사용하지 않는 오류가 있습니다. null과 비교할 때 IS NULL을 사용하고 NULL이 아님 – user2184057

+0

그러면 업데이트가 select 문에서 반환 된 결과로 제한되지 않습니다. – Ginger

답변

1

나는 상관 관계가있는 하위 쿼리를 원한다고 생각합니다. 서술 된 것처럼 하위 쿼리는 외부 쿼리에 연결되어 있지 않으므로 적어도 하나의 행이 조건을 충족시킬 수 있습니다. 그래서 모든 것이 업데이트됩니다.

나는 당신이하려는 생각 :

UPDATE idTempImport2 as tmp2 
    SET DupFlag = TRUE 
WHERE EXISTS (SELECT im.idDate, im.UserID, im.ActionID, im.IsHC, idn.Epic1, idn.Epic2 
       FROM idMain AS im INNER JOIN 
        idNotes AS idn 
        ON im.aID = idn.MainID 
       WHERE idDate BETWEEN "2017-01-02" AND "2017-01-31" AND 
        im.idDate = tmp2.idDate AND im.UserID = tmp2.UserID AND 
        im.ActionID = tmp2.ActionID AND 
        ?.Epic1 = clng(tmp2.Epic1) AND ?.Epic2 = clng(tmp2.Epic2) 
      ); 
+0

완벽하게 작동합니다. 고든에게 감사드립니다. 그리고 설명해 주셔서 감사합니다. – Ginger