2013-04-24 2 views
2

특정 테이블에 존재하고 다른 테이블에없는 모든 행을 선택하여 삭제하려고합니다.한 테이블에 존재하고 다른 테이블에는 존재하지 않는 데이터를 삭제 하시겠습니까?

다음 쿼리를 작성하지만 두 테이블에 행이 있습니다!

SELECT UNIQUE b.values_key FROM request_fo a INNER JOIN rm_trans b 
ON b.values_key != a.req_year || ',' || a.req_ser 
AND b.taskcode = 19 
AND b.values_key IS NOT NULL 
AND a.req_year IS NOT NULL 
AND a.req_ser IS NOT NULL 

은 내가 데이터를 request_fo에 존재하지 rm_trans에 존재 삭제하려면 다음을 사용하려면 :

DELETE request_fo 
FROM request_fo a 
INNER JOIN 
rm_trans b 
ON b.values_key != a.req_year || ',' || a.req_ser 
AND b.taskcode = 19 
AND b.values_key IS NOT NULL 
AND a.req_year IS NOT NULL 
AND a.req_ser IS NOT NULL 

이 권리인가? WHERE 절에 b.values_key IS NULL 술어,

사용 LEFT JOIN 대신하고 DELETE 절에 테이블 이름 대신 별칭 a을 사용합니다 :

DELETE a 
FROM request_fo a 
LEFT JOIN rm_trans b ON b.values_key = a.req_year + ',' + a.req_ser 
         AND b.taskcode = 19 
WHERE b.values_key IS NULL; 
여기
+2

다른 DBMS는 DELETE 조작에 대해 다른 구.을 갖습니다. 특히 조인 조작으로 DELETE가 있습니다. Oracle, DB2, Informix, MySQL, PostgreSQL에서 MS SQL Server가 작동하는 것은 자동으로 예측할 수 없습니다. 일반적으로 Sybase에서는 작동하지만 반드시 작동하지는 않습니다. –

+0

@JonathanLeffler : 그럼 할 수있는 구문 무엇 만족의' LEFT request_fo에서 삭제는 b.values_key = a.req_year + ','+ a.req_ser 및 b.taskcode = 19 B의 rm_trans의 B 가입하세요. values_key IS NULL; in informix –

답변

2

이러한 종류의 작업을 수행하려면 세트로 생각해야합니다. NOT IN (...) 또는 NOT EXISTS (...)이 필요할 때 !=을 사용 중입니다.

귀하의 조항 b.values_key != a.req_year || ',' || a.req_sera의 모든 행을 b의 모든 행과 비교하고 있습니다. 대부분의 경우, 그들은 동등하지 않습니다. 그러나이 특정 행의 values_key이 현재 비교중인 행보다 a 인 다른 행의 a.req_year || ',' || a.req_ser과 일치하는 많은 예제가 있습니다. 그래서 두 테이블 모두에있는 데이터가 반환됩니다.

당신은 이런 식으로 뭔가를 시도하려는 :

DELETE FROM a 
    WHERE NOT EXISTS (SELECT 1 FROM b 
        WHERE b.values_key = a.req_year || ',' || a.req_ser 
         AND b.task_code = 19) 

또한 SELECT * FROM a WHERE NOT EXISTS (...)로 먼저 확인하는 것을 실행해야합니다. 나는 할 것이다.

1

는 그렇게 할 수있는 T-SQL 구문이다

여기에 직접보기 :

req_ser 및와 req_year이 데이터 유형 문자열이고 정수형 인 경우이를 가정합니다.


어떻게 작동합니까?

LEFT JOIN 어떤 항목이 JOIN consition을 만족하지 않으며,이 경우 values_key 값은 그 뛰어난 행의 NULL 것이다있다하더라도 LEFT JOIN의 왼쪽에있는 첫 번째 테이블 request_fo에서 그 뛰어난 열을 포함 . 그 values_keyNULL을 할 수 있도록 예를 들어

, this demo를 참조, 첫 번째 테이블에서 2013 4 그래서 당신에게 주먹을 테이블에서 찾을과에없는 것들을 줄 것이다 WHERE b.values_key IS NULL을 추가, 두 번째 테이블에 존재하지 않는 두 번째 테이블.

+0

왜'b.values_key IS NULL'을 설정합니까?! –

+0

는 'informix'에서이 구문을 허용하지 않습니다. –

5

조인 구문을 사용할 수없는 경우 subselect를 사용할 수도 있습니다.

delete from t1 
where t1 = something 
and not exists 
(
    select 1 
    from t2 
    where t1.key = t2.key 
) 
관련 문제