하위 쿼리를 조건으로 하는 MySQL DELETE FROM
다음과 같은 질문을 하려고 합니다.
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에서는 삭제하려는 테이블을 해당 조건의 하위 쿼리에서 사용할 수 없습니다.
서브쿼리 사용 중 이 질문을 삭제하려는 경우 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)
서브쿼리를 추가 서브쿼리(여기서는 x)로 정리하면 MySQL은 사용자가 원하는 것을 기꺼이 수행합니다.
에일리어스는 다음 뒤에 포함해야 합니다.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
);
삭제할 대상 테이블을 지정할 수 없습니다.
회피책
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);
다음과 같이 delete 스테이트먼트에서 에일리어스를 다시 참조해야 합니다.
DELETE th FROM term_hierarchy AS th
....
저는 조금 다른 방법으로 접근했고, 제게는 효과가 있었습니다.
제거가 필요했습니다.secure_links
내 테이블에서 참조한conditions
테이블에는 조건 행이 남아 있지 않습니다.기본적으로 하우스키핑 스크립트입니다.이로 인해 삭제할 대상 테이블을 지정할 수 없습니다.라는 오류가 발생했습니다.
그래서 여기서 영감을 얻으려고 아래 질문을 해봤는데 잘 작동합니다.이는 임시 테이블을 생성하기 때문입니다.sl1
DELETE의 참조로 사용됩니다.
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`
)
저는 좋아요.
삭제에 "in" 절이 없습니까?서브쿼리로부터 많은 값이 반환되는 경우, 매우 비효율적일 수 있습니다.삭제할 ID의 서브쿼리에서 원래 테이블에 대해 내부(또는 오른쪽)만 조인하지 않고 "in (subquery)"를 선택합니다.
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)
그리고 "MySQL does not allow it"이라고 대답했을지도 모르지만, 삭제 대상을 명확하게 하면 문제없이 동작합니다(DELETE T FROM Target AS T).MySQL에서 Join을 사용하여 삭제하면 DELETE / JOIN 문제가 명확해집니다.
2개의 쿼리로 이 작업을 수행할 경우 항상 다음과 같은 작업을 수행할 수 있습니다.
1) 테이블에서 ID를 가져옵니다.
SELECT group_concat(id) as csv_result FROM your_table WHERE whatever = 'test' ...
그런 다음 마우스/키보드 또는 프로그래밍 언어를 사용하여 결과를 아래 XXX에 복사합니다.
2) DELETE FROM your_table WHERE id IN ( XXX )
한 가지 질문으로 이 작업을 수행할 수 있지만, 이것이 제가 선호하는 것입니다.
delete 스테이트먼트에서 이 방법으로 에일리어스를 사용할 수 있습니다.
DELETE th.*
FROM term_hierarchy th
INNER JOIN term_hierarchy th2 ON (th1.tid = th2.tid AND th2.parent != 1015)
WHERE th.parent = 1015;
@CodeReaper, @BennyHill:예상대로 된다.
그러나 테이블에 수백만 개의 행이 있기 때문에 시간이 얼마나 걸리는지 궁금하네요.듣자하니, 약 2시간 정도 걸려서5ms
올바른 색인화된 테이블에 5k 레코드가 있는 경우 실행합니다.
마이쿼리:
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?
언급URL : https://stackoverflow.com/questions/4471277/mysql-delete-from-with-subquery-as-condition
'sourcecode' 카테고리의 다른 글
Jar Mismatch 종속성 목록에서 2가지 버전의 Android-support-v4.jar가 발견되었습니다. (0) | 2022.09.15 |
---|---|
JavaScript에서 두 날짜의 차이를 알 수 있습니까? (0) | 2022.09.15 |
동일한 값을 여러 변수에 동시에 할당하시겠습니까? (0) | 2022.09.15 |
"알림:정의되지 않은 변수", "알림:정의되지 않은 인덱스", "경고:정의되지 않은 배열 키" 및 "알림:PHP를 사용한 정의되지 않은 오프셋" (0) | 2022.09.15 |
$http 응답 처리 중 서비스 중 (0) | 2022.09.15 |