sql server - एक सीटीई का उपयोग करते हुए स्व-संदर्भित तालिका में लगातार पंक्तियाँ हटा रहा है प्रक्रिया कैसे होती है?
sql-server triggers (1)
मैं एक साइड प्रोजेक्ट पर काम कर रहा हूं, और स्व-संदर्भित तालिका में एक पंक्ति और उसके सभी वंशों को हटाने के लिए, मैं एक ट्रिगर के अंदर एक पुनरावर्ती सीटीई का उपयोग कर रहा हूं:
CREATE TRIGGER dbo.tr_Comment_Delete
ON dbo.Comment INSTEAD OF DELETE
AS
;WITH IDs AS (
SELECT id FROM DELETED
UNION ALL
SELECT c.id
FROM Comment AS c INNER JOIN IDs AS i
ON c.parent_comment_id = i.id
)
DELETE FROM Comment
WHERE id IN (SELECT id FROM IDs);
GO
यह स्वयं संदर्भित तालिका है
यद्यपि मेरे पास यह कोड अपेक्षित रूप से कार्य करता है, लेकिन ऐसा उन मामलों में से एक है जिसमें आप कुछ करते हैं, लेकिन आप यह नहीं जानते हैं कि यह कैसे काम करता है।
अधिक सटीक होने के लिए, मैं जानना चाहता हूं कि यह कैसे है कि इस रिकर्सिव सीटीई (आईडी) का इस्तेमाल करके मैं संदर्भ टिप्पणी को हटाने की कोशिश कर रहा हूं, जब मैं बाल टिप्पणी करता हूं?
यह प्रक्रिया / आदेश किसमें हटा दिया जाता है?
एक उदाहरण के रूप में टिप्पणियों के इस पदानुक्रम को लें:
3-> 8-> 13
यहां आईडी 3 की टिप्पणी रूट टिप्पणी है। टिप्पणी 8 3 टिप्पणी करने का उत्तर है, जैसे कि टिप्पणी 13 की टिप्पणी 8 का उत्तर है।
विलोपन प्रक्रिया वास्तव में कैसे होती है?
पी एस मैंने एक मेज जोड़ने की कोशिश की जिसमें मैंने आईडी को सम्मिलित किया था, जैसा कि उन्होंने गणना की थी। दुर्भाग्य से मैं इसकी भावना नहीं कर सकता। ये ऐसी तालिका के परिणाम हैं:
id ins-date
3 2017-09-12 11:48:38.037
8 2017-09-12 11:48:38.037
13 2017-09-12 11:48:38.037
13 2017-09-12 11:48:38.037
8 2017-09-12 11:48:38.037
13 2017-09-12 11:48:38.037
मुझे लगता है कि आप जटिलता देखते हैं जहां यह मौजूद नहीं है
आपकी गलती है:
स्वयं को संदर्भित सीटीई में बार-बार पंक्तियां हटाना
पुनरावर्ती DELETE
जैसी कोई चीज नहीं है केवल SELECT
हो सकता है
तो प्रसंस्करण सरल है:
रीराक्रिव सीटीई के साथ
SELECT
में हटाने के लिए सभी पंक्तियों की गणनाSELECT
उन सभी को एक ऑपरेशन के साथ
DELETE
बस इतना ही