복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.당신처럼, 삭제 성명에서 다시 별명을 참조해야합니다

    당신처럼, 삭제 성명에서 다시 별명을 참조해야합니다

    DELETE th FROM term_hierarchy AS th
    ....
    

    MySQL의 문서에 여기에 설명 된대로.

  5. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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;
    
  10. from https://stackoverflow.com/questions/4471277/mysql-delete-from-with-subquery-as-condition by cc-by-sa and MIT license