wake-up-neo.com

SQL DELETE mit JOIN einer anderen Tabelle für die WHERE-Bedingung

Ich muss Zeilen aus guide_category Löschen, die keine Beziehung zur Tabelle guide haben (dead relations).

Hier ist, was ich tun möchte, aber es funktioniert natürlich nicht.

DELETE FROM guide_category AS pgc 
 WHERE pgc.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)

Error:

Sie können in der FROM-Klausel keine Zieltabelle 'guide_category' für die Aktualisierung angeben

70
hsz

Aufgrund von Problemen bei der Sperrenimplementierung ist es in MySQL nicht möglich, die betroffene Tabelle mit DELETE oder UPDATE zu referenzieren.

Sie müssen stattdessen hier ein JOIN erstellen:

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

oder benutze einfach ein NOT IN:

DELETE  
FROM    guide_category AS gc 
WHERE   id_guide NOT IN
        (
        SELECT  id_guide
        FROM    guide
        )
105
Quassnoi

Ich denke, nach Ihrer Beschreibung würde Folgendes ausreichen:

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

Ich gehe davon aus, dass es keine referenziellen Integritätsbeschränkungen für die betroffenen Tabellen gibt.

9
Dirk

Probieren Sie diese Beispiel-SQL-Skripte zum leichteren Verständnis aus.

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

Ihr Fall ist:

   DELETE pgc
     FROM guide_category pgc 
LEFT JOIN guide g
       ON g.id_guide = gc.id_guide 
    WHERE g.id_guide IS NULL
4
user2384628