SQL DELETE with JOIN another table for WHERE condition

后端 未结 4 1551
说谎
说谎 2020-11-27 17:44

I have to delete rows from guide_category that have no relation with guide table (dead relations).

Here is what I want to do, but it of cou

相关标签:
4条回答
  • 2020-11-27 18:10

    How about:

    DELETE guide_category  
      WHERE id_guide_category IN ( 
    
            SELECT id_guide_category 
              FROM guide_category AS gc
         LEFT JOIN guide AS g 
                ON g.id_guide = gc.id_guide
             WHERE g.title IS NULL
    
      )
    
    0 讨论(0)
  • 2020-11-27 18:21

    Due to the locking implementation issues, MySQL does not allow referencing the affected table with DELETE or UPDATE.

    You need to make a JOIN here instead:

    DELETE  gc.*
    FROM    guide_category AS gc 
    LEFT JOIN
            guide AS g 
    ON      g.id_guide = gc.id_guide
    WHERE   g.title IS NULL
    

    or just use a NOT IN:

    DELETE  
    FROM    guide_category AS gc 
    WHERE   id_guide NOT IN
            (
            SELECT  id_guide
            FROM    guide
            )
    
    0 讨论(0)
  • 2020-11-27 18:22

    I think, from your description, the following would suffice:

    DELETE FROM guide_category 
    WHERE id_guide NOT IN (SELECT id_guide FROM guide)
    

    I assume, that there are no referential integrity constraints on the tables involved, are there?

    0 讨论(0)
  • 2020-11-27 18:23

    Try this sample SQL scripts for easy understanding,

    CREATE TABLE TABLE1 (REFNO VARCHAR(10))
    CREATE TABLE TABLE2 (REFNO VARCHAR(10))
    
    --TRUNCATE TABLE TABLE1
    --TRUNCATE TABLE TABLE2
    
    INSERT INTO TABLE1 SELECT 'TEST_NAME'
    INSERT INTO TABLE1 SELECT 'KUMAR'
    INSERT INTO TABLE1 SELECT 'SIVA'
    INSERT INTO TABLE1 SELECT 'SUSHANT'
    
    INSERT INTO TABLE2 SELECT 'KUMAR'
    INSERT INTO TABLE2 SELECT 'SIVA'
    INSERT INTO TABLE2 SELECT 'SUSHANT'
    
    SELECT * FROM TABLE1
    SELECT * FROM TABLE2
    
    DELETE T1 FROM TABLE1 T1 JOIN TABLE2 T2 ON T1.REFNO = T2.REFNO
    

    Your case is:

       DELETE pgc
         FROM guide_category pgc 
    LEFT JOIN guide g
           ON g.id_guide = gc.id_guide 
        WHERE g.id_guide IS NULL
    
    0 讨论(0)
提交回复
热议问题