Sql में सभी पंक्तियों को हटाने का सबसे अच्छा तरीका क्या है, लेकिन शीर्ष पर पंक्तियों की संख्या को रखना है?
जवाबों:
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
संपादित करें:
क्रिस एक अच्छा प्रदर्शन लाता है क्योंकि प्रत्येक पंक्ति के लिए TOP 10 क्वेरी चलाई जाएगी। यदि यह एक बार की बात है, तो यह एक सौदे के रूप में बड़ा नहीं हो सकता है, लेकिन अगर यह एक सामान्य बात है, तो मैं इसे करीब से देखता था।
DELETE FROM Table WHERE ID NOT IN (SELECT id FROM (SELECT TOP 10 ID FROM Table) AS x)में MySQL को एक अस्थायी तालिका बनाने के लिए मजबूर करें।
मैं आईडी कॉलम (पंक्तियों) का चयन करूँगा, जिन्हें आप एक टेम्प टेबल या टेबल वैरिएबल में रखना चाहते हैं। फिर उन सभी पंक्तियों को हटा दें जो अस्थायी तालिका में मौजूद नहीं हैं। किसी अन्य उपयोगकर्ता द्वारा उल्लिखित वाक्यविन्यास:
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table)
एक संभावित समस्या है। तालिका में प्रत्येक पंक्ति के लिए "सेलेक्ट टॉप 10" क्वेरी को निष्पादित किया जाएगा, जो एक बहुत बड़ा प्रदर्शन हिट हो सकता है। आप एक ही क्वेरी को बार-बार बनाने से बचना चाहते हैं।
यह सिंटैक्स काम करना चाहिए, जो आपने अपने मूल एसक्यूएल बयान के रूप में सूचीबद्ध किया है:
create table #nuke(NukeID int)
insert into #nuke(Nuke) select top 1000 id from article
delete article where not exists (select 1 from nuke where Nukeid = id)
drop table #nuke
insert into #nuke(Nuke) ...शायद होना चाहिए: insert into #nuke(NukeID) ...साथ ही नाम nuke भ्रामक है क्योंकि आप इन पंक्तियों को हटाने की कोशिश नहीं कर रहे हैं। nuke शायद इस तथ्य के नाम पर है कि इसे हटा दिया जाएगा।
उन लोगों के लिए भविष्य का संदर्भ जो MS SQL का उपयोग नहीं करते हैं।
PostgreSQL उपयोग में ORDER BYऔर LIMITइसके बजाय TOP।
DELETE FROM table
WHERE id NOT IN (SELECT id FROM table ORDER BY id LIMIT n);
MySQL - अच्छी तरह से ...
त्रुटि - MySQL का यह संस्करण अभी तक 'LIMIT & IN / ALL / any / SOME सबक्वेरी' का समर्थन नहीं करता है
अभी तक मेरा अनुमान नहीं है।
मुझे लगता है कि एक वर्चुअल टेबल का उपयोग करना एक इन-क्लॉज या टेम्प टेबल से बेहतर होगा।
DELETE
Product
FROM
Product
LEFT OUTER JOIN
(
SELECT TOP 10
Product.id
FROM
Product
) TopProducts ON Product.id = TopProducts.id
WHERE
TopProducts.id IS NULL
मैं अन्य स्वादों के बारे में नहीं जानता, लेकिन MySQL DELETE LIMIT की अनुमति देता है।
यदि आप चीजों को ऑर्डर कर सकते हैं ताकि आप जिस एन पंक्तियों को रखना चाहते हैं, वह सबसे नीचे हो, तो आप टेबल लिमिट टेबल-एन से डिलीट कर सकते हैं।
संपादित करें
Oooo। मुझे लगता है कि मुझे Cory फॉय का जवाब बेहतर लगता है, यह मानते हुए कि यह आपके मामले में काम करता है। तुलना करने से मेरा तरीका थोड़ा क्लिंकी लगता है।
यह वास्तव में भाषा विशिष्ट होने जा रहा है, लेकिन मैं संभवतः SQL सर्वर के लिए निम्नलिखित की तरह कुछ का उपयोग करेगा।
declare @n int
SET @n = SELECT Count(*) FROM dTABLE;
DELETE TOP (@n - 10 ) FROM dTable
यदि आप पंक्तियों की सही संख्या की परवाह नहीं करते हैं, तो हमेशा होता है
DELETE TOP 90 PERCENT FROM dTABLE;
यहाँ देखें कि मैंने यह कैसे किया। यह विधि अधिक तेज़ और सरल है:
OFFSET कमांड का उपयोग करके MS SQL में डेटाबेस टेबल से सभी लेकिन शीर्ष n को हटा दें
WITH CTE AS
(
SELECT ID
FROM dbo.TableName
ORDER BY ID DESC
OFFSET 11 ROWS
)
DELETE CTE;
उस IDकॉलम से प्रतिस्थापित करें जिसके द्वारा आप सॉर्ट करना चाहते हैं। OFFSETउन पंक्तियों की संख्या के बाद नंबर बदलें, जिन्हें आप हटाना चाहते हैं। चुनें DESCया ASC- जो भी आपके मामले के अनुरूप हो।
मुझे TOPहर पंक्ति के लिए अभिव्यक्ति निष्पादित करने से बचने के लिए एक ट्रिक मिली है । हम जिस चीज को रखना चाहते हैं उसे पाने के लिए हम TOPसाथ जोड़ सकते हैं । फिर हम सब कुछ से अधिक हटा देते हैं ।MAXMaxIdMaxId
-- Declare Variable to hold the highest id we want to keep.
DECLARE @MaxId as int = (
SELECT MAX(temp.ID)
FROM (SELECT TOP 10 ID FROM table ORDER BY ID ASC) temp
)
-- Delete anything greater than MaxId. If MaxId is null, there is nothing to delete.
IF @MaxId IS NOT NULL
DELETE FROM table WHERE ID > @MaxId
नोट: उचित परिणाम सुनिश्चित ORDER BYकरने के MaxIdलिए घोषणा करते समय उपयोग करना महत्वपूर्ण है ।