2009-07-24 13 views
6

मुझे कुछ तालिका से हटाने के लिए एक SQL कथन बनाने की आवश्यकता है जो किसी अन्य चयन कथन से मेल खाता है।एसक्यूएल सर्वर हटाएं और खंड

Teradata में हम

delete from table1 
where (col1, col2) in (
    select col1,col2 
    from table2 
) 

का उपयोग करते हैं एसक्यूएल सर्वर में यह WHERE..IN खंड में 1 से अधिक स्तंभ के लिए अनुमति नहीं है। मैंने सोचा कि मैं इन खंडों का उपयोग कर सकता हूं:

with tempTable(col1,col2) as (
select col1,col2 
from table2 
) 
delete from table1 
where table1.col1 = tempTable.col1 
and table1.col2 = tempTable.col2 

..DELETE खंड के साथ कैसे उपयोग करें? क्या कोई और तरीका है?

उत्तर

19

यह करना चाहिए:

DELETE Table1 
from Table1 t1 
    inner join tempTable t2 
    on t2.Col1 = t1.Col1 
    and t2.Col2 = t1.Col2 
+1

लिए काम करता है ... आप इस्तेमाल कर सकते हैं खंड के साथ, लेकिन इस तरह से आसान है। –

+0

धन्यवाद यह काम किया! लेकिन ..DELETE के साथ कैसे उपयोग करें? – ala

+0

इसके बारे में सोचते हुए, मुझे खंड के उपयोग का कोई कारण नहीं दिखता है। जब चीजें गंभीरता से गन्दा या जटिल होती हैं, तो मैं इसका उपयोग करता हूं, और किसी अन्य तालिका में सरल जुड़ने के आधार पर तालिका से हटाना अतिरिक्त कोडिंग प्रयास की गारंटी देने के लिए पर्याप्त जटिल नहीं है। –

1
delete from table1 t1 where exists 
    ( 

    select 1 from table2 t2 where t1.col1 = t2.col1 and t1.col2 > t2.col2 

) 
+1

इस वाक्य रचना गलत –

+1

है वाक्य रचना सही नहीं है, लेकिन सामान्य विचार सही है। एसक्यूएल सर्वर इसे अनुकूलित कर सकता है ताकि इसे आईएमओ पढ़ने में आसान होने के दौरान एक संयोजन का उपयोग करके समाधान करना चाहिए। – EvilRyry

4

पहले एक प्रश्न है कि आवश्यक पंक्तियों का चयन करता है निर्माण:

SELECT t1.* 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.[col1] = t2.[col1] AND t1.[Col2]=t2.[Col2] 

टेस्ट यह यकीन है कि यह वास्तव में रिटर्न पंक्तियों बनाने के लिए आप हटाना चाहते हैं। फिर बदल कर एक हटाने बयान में बदल "का चयन करें" "हटाएं" और स्तंभ सूची को हटाने के लिए:

DELETE t1 
FROM [Table1] t1 
INNER JOIN [Table2] t2 ON t1.[col1] = t2.[col1] AND t1.[Col 
+0

एसएसएमएस में यह अच्छी सलाह है, लेकिन व्यावहारिक रूप से बहुत व्यावहारिक नहीं है .... – RolandTumble

+1

+1 दो बार मापने और – 2Toad

0
with tempTable(col1,col2) as (
    select col1,col2 
    from table2 
) 
delete table1 from tempTable 
where table1.col1 = tempTable.col1 
and table1.col2 = tempTable.col2 
+1

काटने के लिए +1 हमेशा कोड-केवल उत्तर रखने के बजाय कुछ स्पष्टीकरण शामिल करना बेहतर होता है क्योंकि इससे भविष्य के लिए यह अधिक उपयोगी हो जाता है पाठकों। – EJoshuaS

+0

स्टैक ओवरफ़्लो में आपका स्वागत है! हालांकि यह कोड स्निपेट समस्या का समाधान कर सकता है, यह स्पष्ट नहीं करता है कि यह सवाल का जवाब क्यों देता है या कैसे। कृपया [अपने कोड के लिए स्पष्टीकरण शामिल करें] (// meta.stackexchange.com/q/114762/269535), क्योंकि यह वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जानते हैं। ** फ्लैगर्स/समीक्षकों: ** [केवल कोड के लिए उत्तर जैसे, डाउनवोट, हटाएं नहीं!] (// meta.stackoverflow.com/a/260413/2747593) –

0

यह मैं

WITH CTE AS 
(
SELECT TOP 50000 * 
from v020101hist order by data 
) 
DELETE FROM CTE 
संबंधित मुद्दे