2012-09-15 40 views

उत्तर

2

आप विस्तार तालिका के अनुक्रमिक स्कैनिंग के लिए अतिरिक्त ब्लॉक का उपयोग कर सकते हैं और रिकॉर्ड्स को हटा सकते हैं जहां कोई मास्टर रिकॉर्ड मेल नहीं खाता है।

EXECUTE BLOCK 
AS 
    DECLARE VARIABLE C CURSOR FOR 
    (SELECT d.id 
    FROM detail d LEFT JOIN master m 
     ON d.master_id = m.id 
    WHERE m.id IS NULL); 
    DECLARE VARIABLE I INTEGER; 
BEGIN 
    OPEN C; 
    WHILE (1 = 1) DO 
    BEGIN 
    FETCH C INTO :I; 
    IF(ROW_COUNT = 0)THEN 
     LEAVE; 
    DELETE FROM detail WHERE id = :I; 
    END 
    CLOSE C; 
END 
3

(NOT) IN आमतौर पर (NOT) EXISTS का उपयोग करके अनुकूलित किया जा सकता है।

DELETE 
FROM SLAVE_TABLE 
WHERE NOT EXISTS (SELECT 1 FROM MASTER_TABLE M WHERE M.ITEM_ID = ITEM_ID) 

मुझे यकीन है कि आप यहाँ करने के लिए कोशिश कर रहे हैं, लेकिन मेरे लिए इस क्वेरी इंगित करता है कि आप, बाधाओं के इस तरह लागू गड़बड़ बाद में सफाई करने के लिए क्वेरी नहीं चलाने के लिए विदेशी कुंजी का उपयोग किया जाना चाहिए नहीं कर रहा हूँ।

+0

ऑन डिलीट कैस्केड नियम के साथ विदेशी कुंजी स्वचालित रूप से नौकरी करेगी। –

+0

विदेशी कुंजी निश्चित रूप से इष्टतम होगी, लेकिन दुर्भाग्यवश इस मामले में बहुत देर हो चुकी है। – Harriv

+0

ठीक है, लेकिन इस क्वेरी को चलाने के बाद, सुनिश्चित करें कि आप इस तरह की बाधा डालते हैं (उदाहरण के लिए आंद्रेई द्वारा सुझाए गए डिलीट कैस्केड के साथ)। –