2014-05-21 2 views
0

두 테이블이 있는데 하나는 TEMP이고 다른 하나는 MAIN입니다. 그래서 내가하려는 것은 TEMP 테이블의 모든 레코드가 MAIN 테이블에 있는지 확인하는 것입니다. 논리는 temp 테이블의 모든 레코드가 주 테이블에 있어야하지만 여기서 SQL 쿼리를 실행할 때 필요합니다. 나에게 어떤 레코드도 제공하지 않으며 임시 테이블의 주 테이블에 누락 된 레코드가 있다는 것을 알고 있습니다. 여기서 내가 뭘 잘못하고 있니?SQL에서 if exists 문을 사용하여 문제가 발생했습니다

IF EXISTS(SELECT DISTINCT GRP_NM 
       ,GRP_VAL 
      FROM TEMP 
      WHERE GRP_NM + GRP_VAL NOT IN (SELECT GRP_NM + GRP_VAL FROM MAIN) 
     ) 
    BEGIN 
    INSERT INTO MAIN(GRP_NM, GRP_VAL)  
    SELECT GRP_NM 
     ,GRP_VAL 
    FROM MAIN 
    WHERE GRP_NM + GRP_VAL NOT IN (SELECT GRP_NM + GRP_VAL FROM MAIN) 

    END 
+1

어떻게됩니까? 당신은 똑같은 논리를 반복하고있는 것처럼 보입니다. 나는 존재한다면 외부가 필요하다는 것을 확신하지 못합니다. –

+0

그것은 아무런 값도 반환하지 않고 누락 된 약 28 개의 레코드가 있다는 것을 알고 있습니다. – moe

답변

2

문제가 NULL과 관련 있다고 생각됩니다. 어느 테이블에서도 GRP_NM 또는 GRP_VAL이 null 인 경우 GRP_NM + GRP_VAL은 null이되고 IN 문과 EXISTS 문은 완전히 bollix up됩니다.

어떤 경우에는,이 밖으로 시도 :

INSERT MAIN (GRP_NM, GRP_VAL) 
select GRP_NM, GRP_VAL 
    from TEMP 
except select GRP_NM, GRP_VAL 
    from MAIN 
3

INSERT INTO MAIN (GRP_NM, GRP_VAL)  
SELECT GRP_NM, GRP_VAL 
FROM dbo.MAIN m 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM dbo.TEMP t 
    WHERE t.GRP_NM = m.GRP_NM 
    AND  t.GRP_VAL = m.GRP_VAL 
) 

참고하십시오 : NOT EXISTS 때문에 NOT IN (subquery) 행동 대신 NOT IN 사용을 때 하위 쿼리 반환에 NULL :

SELECT 'No, no, no' AS ColA 
FROM (SELECT 1) x(y) 
WHERE 1 NOT IN 
(
    SELECT 2 
    UNION ALL 
    SELECT NULL 
) 

SELECT 'Yep' AS ColB 
FROM (SELECT 1) x(y) 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM 
    (
     SELECT 2 
     UNION ALL 
     SELECT NULL 
    ) a(b) 
    WHERE a.b = x.y 
) 

결과 :

ColA 
---------- 

(0 row(s) affected) 

ColB 
---- 
Yep 

(1 row(s) affected) 
2
INSERT INTO MAIN(GRP_NM, GRP_VAL)  
SELECT GRP_NM, GRP_VAL 
FROM TEMP 
WHERE NOT EXISTS (SELECT 1 
       FROM MAIN 
       WHERE GRP_NM = TEMP.GRP_NM 
       AND GRP_VAL = TEMP.GRP_VAL) 
1

을 코드의 두 번째 부분에서 같은 테이블 홈페이지 (안 TEMP에서)에서 값을 삽입하기 위해 노력하고 있습니다. 어쩌면 오타 일 수도 있습니다. 다음과 같이하십시오 : 당신은 혼자 WHERE이 GRP_NM + GRP_VAL NOT IN (홈페이지에서 선택 GRP_NM + GRP_VAL) 일부 주요 로부터, GRP_VAL을 SELECT GRP_NM을 실행할 때

IF EXISTS(SELECT DISTINCT GRP_NM, GRP_VAL FROM TEMP WHERE GRP_NM + GRP_VAL NOT IN (SELECT GRP_NM  + GRP_VAL FROM MAIN)) 
    BEGIN 
INSERT INTO MAIN(GRP_NM, GRP_VAL)  
SELECT GRP_NM, GRP_VAL FROM TEMP 
WHERE GRP_NM + GRP_VAL NOT IN (SELECT GRP_NM + GRP_VAL FROM MAIN) 

END 
+1

연결 값의 비교는 좋지 않습니다. 'A'+ '1'= 'A'+ '1'THEN 'TRUE'ELSE 'FALSE'END'. –

관련 문제