2009-12-30 12 views
69

के लिए एक और तालिका में शामिल होने के साथ SQL हटाएं मुझे guide_category से पंक्तियों को हटाना होगा जिनके guide तालिका (मृत संबंध) से कोई संबंध नहीं है।WHERE स्थिति

यह वही है जो मैं करना चाहता हूं, लेकिन यह निश्चित रूप से काम नहीं करता है।

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) 

त्रुटि:

You can't specify target table 'guide_category' for update in FROM clause

+1

यह MySQL में एक बुरा सीमा की वजह से है। Quassnoi के जवाब देखें - उसे इस से निपटने का सही समाधान मिला है। –

उत्तर

102

ताला कार्यान्वयन मुद्दों के कारण, MySQLDELETE या UPDATE साथ प्रभावित तालिका संदर्भित अनुमति नहीं है। एक NOT IN

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

या बस का उपयोग करें::

DELETE 
FROM guide_category AS gc 
WHERE id_guide NOT IN 
     (
     SELECT id_guide 
     FROM guide 
     ) 
+14

यदि आप टीएसक्यूएल का उपयोग कर रहे हैं, तो 'DELETE gc। *' – Gezim

+4

के बजाय 'DELETE gc' का उपयोग करें MySQL> 5.0 के लिए यह' gc। * ' – DanFromGermany

+0

के बजाय 'DELETE gc' भी है लेकिन कौन सा तेज़ है? – duleshi

-2

कैसे के बारे में:

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

यह मूल क्वेरी है और मूल तालिका को व्युत्पन्न तालिका अभिव्यक्ति में संदर्भित करने की सटीक समस्या है। – siride

9

मैं अपने विवरण से लगता है, है, तो निम्न पर्याप्त होगा:

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

आप यहाँ बजाय एक JOIN बनाने की जरूरत है

मुझे लगता है, कोई रेफेरेंन्शिअल सत्यनिष्ठा constrai देखते हैं कि शामिल टेबल पर एनटीएस, वहाँ हैं?

+0

यह थोड़ा धीमा होगा क्योंकि यह प्रत्येक प्रविष्टि – Toumi

+0

के लिए एक (SELECT id_guide FROM गाइड) निष्पादित करेगा जो वास्तव में निर्भर करता है, @Toumi। क्वेरी प्लानर/ऑप्टिमाइज़र यहां दृश्यों के पीछे बहुत कुछ कर सकता है। – Dirk

4

, आसान समझने के लिए इस नमूने SQL स्क्रिप्ट का प्रयास करें

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 

आपका मामला है:

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

अब यह जवाब है। सरल और ठोस। अच्छी तरह से किया गया सर – NikosKeyz

+0

@ निकोसकेज़ यह स्वीकार्य उत्तर के समान जवाब है, है ना? – sstn

+0

@ एसएसटीएन संख्या। स्वीकृत उत्तर मेरे लिए काम नहीं करता था। यह मेरे लिए सबसे अच्छा जवाब है। – NikosKeyz