2013-07-19 2 views
-1
나는 다음과 같은 구문을 사용하여 테이블에 삽입하기 위해 노력하고있어

에 영향을 미치는 존재하지 위치를 선택 : 영향삽입 0 행

INSERT INTO table1(
col1, col2, col3) 
SELECT distinct 
col1, col2, getDate() 
FROM table2 WHERE NOT EXISTS(
    SELECT 1 FROM table1, table2 
    WHERE ((table1.col1 = table2.col1) or (table1.col1 is null and table2.col1 is null)) 
    AND ((table1.col2 = table2.col2) or (table1.col2 is null and table2.col2 is null))) 

하지만 쿼리를 실행할 때, 그것은 보여줍니다 (0 행 (들)).

NOT EXISTS 문 내의 SELECT 문은 삽입하고 싶지 않은 행의 정확한 수를 반환합니다. WHERE NOT EXISTS 문없이 테이블에 삽입하려고하면 모든 것이 삽입됩니다. table1에 아직없는 행만 삽입하려고합니다.

+1

하십시오 [편집] table1'와'table2''일부 샘플 데이터, 당신은 삽입 할 것으로 예상 table2''의 행을 제공하기 위해 귀하의 질문. (당신의'NOT EXISTS' 질의는 끔찍하지만, 사용하기위한 샘플 데이터가 없으면 그것을 향상시키는 특별한 방법을 제안하기는 어렵습니다.) –

+0

'Exists'가'TableX에서 Select * (1 선택)' – bummi

답변

0

당신이 쿼리를 상당히을 최적화 할 수 있습니다,하지만 빠른 수정으로 당신은 변경 될 수 있습니다 :

SELECT 1 FROM table1, table2 

에 :

SELECT 1 FROM table1 

이것은 당신의 하위 쿼리에 외부 표 2를 묶어 것입니다.

+0

그건 의미가 있습니다! 고맙습니다! – DobleA

1

이 시도 :

INSERT INTO table1(col1, col2, col3) 
SELECT distinct col1, col2, getDate() 
FROM table2 WHERE NOT EXISTS(
    SELECT 1 FROM table1 
    WHERE ((table1.col1 = table2.col1) or (table1.col1 is null and table2.col1 is null)) 
    AND ((table1.col2 = table2.col2) or (table1.col2 is null and table2.col2 is null))) 
+0

거룩한 쓰레기. 나는 그것을했다라고 생각한다! 왜이게 효과가 있고 내가 가진 것이 아닌지 설명해 주시겠습니까? – DobleA

+0

안녕하세요, 하위 쿼리에서 Table2를 사용하는 경우 기본 쿼리와 동일하지 않지만 복사본입니다. 대신, 당신이 주요 쿼리의 Table2를 사용한다면 두 테이블을 연결하여 결과가 정확합니다. –

+0

알았어요. 고맙습니다! – DobleA