2009-10-27 16 views
8

दर्ज करें, मैं दो SQL सर्वर 2008 तालिकाओं के बीच कुछ डेटा स्थानांतरित करने का प्रयास कर रहा हूं। यदि तालिका 1 से तालिका के साथ तालिका 2 में रिकॉर्ड मौजूद है तो तालिका 1 से डेटा के साथ उस रिकॉर्ड को अद्यतन करें, अन्यथा एक नया रिकॉर्ड डालें।यदि रिकॉर्ड मौजूद है, तो

तालिका 1 में मेरे पास कई कॉलम हैं; पहला नाम, उपनाम, ईमेल और इतने पर।

मुझे पूरा यकीन नहीं है कि टेबल 1 को अपडेट करने के लिए क्वेरी को कैसे व्यवस्थित किया जाए यदि तालिका 1 से ईमेल मौजूद है या तालिका 1 में तालिका 1 में मौजूद नहीं है तो एक नई पंक्ति डालें।

मैंने Google पर कुछ खोज करने की कोशिश की लेकिन अधिकांश समाधान कुछ संग्रहीत प्रक्रिया बनाकर काम करते हैं। तो मुझे आश्चर्य हुआ कि क्या कोई यह जान सकता है कि एक उपयुक्त क्वेरी कैसे बनाई जाए जो चाल चल सकती है?

उत्तर

9
MERGE 
INTO table2 t2 
USING table1 t1 
ON  t2.email = t1.email 
WHEN MATCHED THEN 
UPDATE 
SET  t2.col1 = t1.col1, 
     t2.col2 = t1.col2 
WHEN NOT MATCHED THEN 
INSERT (col1, col2) 
VALUES (t1.col1, t1.col2) 
20

मुझे लगता है कि MERGE वह है जो आप चाहते हैं।

+0

+1 अच्छा समाधान। –

+0

यह वही है जो MERGE के लिए डिज़ाइन किया गया था ... (कुछ विषयों को इस "यूपीएसईआरटी" कहते हैं, भले ही यह केवल INSERT/UPDATE से अधिक संभालती है)। –

1

माइक्रोसॉफ्ट ने एसक्यूएल टेबल के बीच a tool to compare data जारी किया, यह कुछ स्थितियों में एक अच्छा विकल्प हो सकता है।

संपादित करें: उल्लेख करने के लिए भूल गए, यह गायब या अलग पंक्तियों को सम्मिलित/अपडेट करने के लिए एक स्क्रिप्ट भी उत्पन्न करता है।

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

नीचे दिए गए 'अपडेटिंग' और 'लापता' प्रश्नों को आप चाहते हैं।

BEGIN TRAN 

create table #table1 (id int, fname varchar(20), email varchar(20)) 
insert into #table1 values (1, 'name_1_updated', 'email_1') 
insert into #table1 values (3, 'name_3_updated', 'email_3') 
insert into #table1 values (100, 'name_100', 'email_100') 


create table #table2 (id int, fname varchar(20), email varchar(20)) 
insert into #table2 values (1, 'name_1', 'email_1') 
insert into #table2 values (2, 'name_2', 'email_2') 
insert into #table2 values (3, 'name_3', 'email_3') 
insert into #table2 values (4, 'name_4', 'email_4') 

print 'before update' 
select * from #table2 

print 'updating' 
update #table2 
set #table2.fname = t1.fname 
from #table1 t1 
where t1.email = #table2.email 

print 'insert missing' 
insert into #table2 
select * from #table1 
where #table1.email not in (select email from #table2 where email = #table1.email) 

print 'after update' 
select * from #table2 

drop table #table1 
drop table #table2 

ROLLBACK 
+0

हे मैन, उपरोक्त क्वेरी लिखने के लिए समय बिताने के लिए धन्यवाद। बहुत सराहना की ... मैं इसे आज़मा दूंगा। – doubleplusgood

+0

यदि यह पूर्व SQL 2008 का उपयोग करने वाले किसी के लिए है, क्योंकि MERGE कमांड केवल SQL 2008 में समर्थित है। उन्होंने इसे आरटीएम रिलीज से खींच लिया। मूर्खतापूर्ण एसक्यूएल टीम। – invert

संबंधित मुद्दे