में अनुकूलन करने के लिए DELETE .. नहीं .. सबक्वेरी?मैं कैसे नष्ट क्वेरी इस तरह की है Firebird
5
A
उत्तर
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)
मुझे यकीन है कि आप यहाँ करने के लिए कोशिश कर रहे हैं, लेकिन मेरे लिए इस क्वेरी इंगित करता है कि आप, बाधाओं के इस तरह लागू गड़बड़ बाद में सफाई करने के लिए क्वेरी नहीं चलाने के लिए विदेशी कुंजी का उपयोग किया जाना चाहिए नहीं कर रहा हूँ।
ऑन डिलीट कैस्केड नियम के साथ विदेशी कुंजी स्वचालित रूप से नौकरी करेगी। –
विदेशी कुंजी निश्चित रूप से इष्टतम होगी, लेकिन दुर्भाग्यवश इस मामले में बहुत देर हो चुकी है। – Harriv
ठीक है, लेकिन इस क्वेरी को चलाने के बाद, सुनिश्चित करें कि आप इस तरह की बाधा डालते हैं (उदाहरण के लिए आंद्रेई द्वारा सुझाए गए डिलीट कैस्केड के साथ)। –