원인
MySQL 은 Oracle 과는 달리 UPDATE 나 DELETE 시 자기 테이블의 데이타를 바로 사용 못하므로 아래와 같은 SQL 을 실행시 1093 에러가 발생함.
DELETE
FROM cwd_group
WHERE id IN
(SELECT DISTINCT a.id ext_id
FROM cwd_group a
JOIN cwd_group b ON a.group_name=b.group_name
JOIN cwd_directory d ON d.id=a.directory_id
WHERE a.directory_id != b.directory_id
AND directory_name = 'My JIRA Server');
SQL
처리
Sub Query 를 하나 더 넣고 sub query 결과를 임시 테이블로 만든후에 실행하면 해결됨.
아래 예제처럼 SELECT ext_id FROM 뒤에 오는 sub query 의 결과를 tmp 라는 임시 테이블에 저장하여 사용
DELETE
FROM cwd_group
WHERE id IN
(SELECT ext_id
FROM
(SELECT DISTINCT a.id ext_id
FROM cwd_group a
JOIN cwd_group b ON a.group_name=b.group_name
JOIN cwd_directory d ON d.id=a.directory_id
WHERE a.directory_id != b.directory_id
AND directory_name = 'My JIRA Server') tmp) ;
SQL
자기 테이블의 sub query 결과를 받아서 반영할 경우 아래와 같은 서브 쿼리 대신 를 실행할 경우 1093 에러를 접하게 된다.
UPDATE tbl1
set name = concat(name, 'aa')
where id in (select id from tbl1 where name is not null);
CODE
단일 테이블일 경우 아래와 같이 sub query 의 결과를 임시 테이블(tbl1_result)로 만들어서 한 번 더 감싸도록 서브 쿼리를 작성하면 됨.
UPDATE tbl1
set name = concat(name, 'aa')
where id in (
select tbl1_alias.nid
from (
select id nid
from tbl1
where name is not null
) tbl1_alias
);
CODE
Ref