[SQL] 조건으로 하위 쿼리에서 삭제 MYSQL
SQL조건으로 하위 쿼리에서 삭제 MYSQL
나는 이런 식으로 쿼리를 수행하는 것을 시도하고있다 :
DELETE FROM term_hierarchy AS th
WHERE th.parent = 1015 AND th.tid IN (
SELECT DISTINCT(th1.tid)
FROM term_hierarchy AS th1
INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015)
WHERE th1.parent = 1015
);
아마 당신은 말할 수 같은 TID가 다른 부모가있는 경우, 나는 1015에 부모 관계를 삭제할. 그러나 나에게 구문 오류를 산출한다 :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS th
WHERE th.parent = 1015 AND th.tid IN (
SELECT DISTINCT(th1.tid)
FROM ter' at line 1
나는 문서를 확인하고, 자체적으로 하위 쿼리를 실행, 모든 체크 아웃 것 같다있다. 잘못된 여기에 무엇을 캔 사람 그림?
업데이트 :로 아래 대답, MySQL은 당신이에서 삭제하고 테이블이 조건에 대한 하위 쿼리에서 사용할 수 허용하지 않습니다.
해결법
-
==============================
1.당신은 삭제에 대한 목표 테이블을 지정할 수 없습니다.
당신은 삭제에 대한 목표 테이블을 지정할 수 없습니다.
해결 방법
create table term_hierarchy_backup (tid int(10)); <- check data type insert into term_hierarchy_backup SELECT DISTINCT(th1.tid) FROM term_hierarchy AS th1 INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015) WHERE th1.parent = 1015; DELETE FROM term_hierarchy AS th WHERE th.parent = 1015 AND th.tid IN (select tid from term_hierarchy_backup);
-
==============================
2.하위 쿼리를 사용하는 동안 삭제하고자하는이 질문을 찾아 다른 사람들을 위해, 나는 (어떤 사람들은 그것을 할 수 없다고 생각하는 것 같다 경우에도)의 MySQL을보다 똑똑 당신에게이 예제를 남겨 :
하위 쿼리를 사용하는 동안 삭제하고자하는이 질문을 찾아 다른 사람들을 위해, 나는 (어떤 사람들은 그것을 할 수 없다고 생각하는 것 같다 경우에도)의 MySQL을보다 똑똑 당신에게이 예제를 남겨 :
DELETE e.* FROM tableE e WHERE id IN (SELECT id FROM tableE WHERE arg = 1 AND foo = 'bar');
당신에게 오류를 줄 것이다 :
ERROR 1093 (HY000): You can't specify target table 'e' for update in FROM clause
그러나이 쿼리를 :
DELETE e.* FROM tableE e WHERE id IN (SELECT id FROM (SELECT id FROM tableE WHERE arg = 1 AND foo = 'bar') x);
잘 작동합니다 :
Query OK, 1 row affected (3.91 sec)
추가 하위 쿼리 (여기라는 이름의 배)에 하위 쿼리를 감싸고 MySQL은 행복하게 당신이 무엇을 물어 할 것입니다.
-
==============================
3.별명은 DELETE 키워드 다음에 포함되어야한다 :
별명은 DELETE 키워드 다음에 포함되어야한다 :
DELETE th FROM term_hierarchy AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT DISTINCT(th1.tid) FROM term_hierarchy AS th1 INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015) WHERE th1.parent = 1015 );
-
==============================
4.당신처럼, 삭제 성명에서 다시 별명을 참조해야합니다
당신처럼, 삭제 성명에서 다시 별명을 참조해야합니다
DELETE th FROM term_hierarchy AS th ....
MySQL의 문서에 여기에 설명 된대로.
-
==============================
5.나는 약간 다른 방식으로이 문제를 접근하고 그것은 나를 위해 일한;
나는 약간 다른 방식으로이 문제를 접근하고 그것은 나를 위해 일한;
나는 더 이상 행이 남아있는 상태로 있었다 조건 테이블을 참조하는 나의 테이블에서 secure_links을 제거 할 필요가 있었다. 기본적으로 가사 스크립트. 이것은 나에게 오류를 준 - 당신은 삭제에 대한 목표 테이블을 지정할 수 없습니다.
영감 여기를 찾고 그래서 나는 아래의 쿼리를 내놓았다 그리고 그것은 잘 작동합니다. 가 DELETE를위한 기준으로서 사용되는 임시 테이블 (SL1)를 생성하기 때문이다.
DELETE FROM `secure_links` WHERE `secure_links`.`link_id` IN ( SELECT `sl1`.`link_id` FROM ( SELECT `sl2`.`link_id` FROM `secure_links` AS `sl2` LEFT JOIN `conditions` ON `conditions`.`job` = `sl2`.`job` WHERE `sl2`.`action` = 'something' AND `conditions`.`ref` IS NULL ) AS `sl1` )
나를 위해 작동합니다.
-
==============================
6.하지 삭제 ...의 절 "의"이고, 매우 비효율적, 서브 쿼리에서 반환 된 값의 많은 수있을려고하는 경우에? 아니 당신이 단지 내부 (또는 오른쪽), 오히려 "에서 (하위 쿼리)"우리보다 삭제할 ID의 하위 쿼리에서 다시 원래의 테이블에 대해 가입하지 왜.?
하지 삭제 ...의 절 "의"이고, 매우 비효율적, 서브 쿼리에서 반환 된 값의 많은 수있을려고하는 경우에? 아니 당신이 단지 내부 (또는 오른쪽), 오히려 "에서 (하위 쿼리)"우리보다 삭제할 ID의 하위 쿼리에서 다시 원래의 테이블에 대해 가입하지 왜.?
DELETE T FROM Target AS T RIGHT JOIN (full subquery already listed for the in() clause in answers above) ` AS TT ON (TT.ID = T.ID)
어쩌면 나를 위해, 그러나,이 작동 잘 내가 완전히 (대상 AS T에서 삭제 T)을 삭제하는 것을 명확히해야합니다 제공 "을 허용하지 않습니다 MySQL의의"로 대답한다. MySQL의에 참여하기로 삭제하면이 DELETE / 문제를 가입 명확하게.
-
==============================
7.당신이이 쿼리를 사용하여이 작업을 수행하려는 경우, 당신은 항상이 비슷한 작업을 수행 할 수 있습니다
당신이이 쿼리를 사용하여이 작업을 수행하려는 경우, 당신은 항상이 비슷한 작업을 수행 할 수 있습니다
1) 테이블로부터 잡아 IDS :
SELECT group_concat(id) as csv_result FROM your_table WHERE whatever = 'test' ...
그런 다음 아래 XXX에 마우스 / 키보드 또는 프로그래밍 언어에 결과를 복사 :
2) DELETE FROM your_table WHERE id IN ( XXX )
어쩌면 당신은 하나 개의 쿼리에서이 작업을 수행 할 수 있지만, 내가 선호하는 것입니다.
-
==============================
8.@CodeReaper, @BennyHill : 그것은 예상대로 작동합니다.
@CodeReaper, @BennyHill : 그것은 예상대로 작동합니다.
그러나, 나는 테이블에서 수백만 개의 행을 가진의 시간 복잡도를 궁금해? 분명히, 그것은 제대로 인덱스 테이블에 5K 기록을 가지고위한 실행 5ms의 걸렸다.
내 검색어 :
SET status = '1' WHERE id IN ( SELECT id FROM ( SELECT c2.id FROM clusters as c2 WHERE c2.assign_to_user_id IS NOT NULL AND c2.id NOT IN ( SELECT c1.id FROM clusters AS c1 LEFT JOIN cluster_flags as cf on c1.last_flag_id = cf.id LEFT JOIN flag_types as ft on ft.id = cf.flag_type_id WHERE ft.slug = 'closed' ) ) x)``` Or is there something we can improve on my query above?
-
==============================
9.당신은 삭제 문에이 방법으로 별칭을 사용할 수 있습니다
당신은 삭제 문에이 방법으로 별칭을 사용할 수 있습니다
DELETE th.* FROM term_hierarchy th INNER JOIN term_hierarchy th2 ON (th1.tid = th2.tid AND th2.parent != 1015) WHERE th.parent = 1015;
from https://stackoverflow.com/questions/4471277/mysql-delete-from-with-subquery-as-condition by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQLite 데이터베이스에 날짜 값을 삽입합니까? (0) | 2020.04.03 |
---|---|
[SQL] 포스트 그레스를 사용하여 한 번에 3 개 테이블의 데이터 삽입 (0) | 2020.04.03 |
[SQL] 어떻게 SQL에서 복합 기본 키를 정의 할 수 있습니다? (0) | 2020.04.03 |
[SQL] 합니까 외래 키 쿼리 성능을 향상? (0) | 2020.04.03 |
[SQL] MySQL의에서 다음 자동 증가 ID를 얻는 방법 (0) | 2020.04.03 |