2012-05-09 25 views
8

मैं एक डेटाबेस परियोजना के भीतर मर्ज बयान उपयोग कर रहा हूँ नीचे निम्नलिखित जैसे एक स्थिर मूल्य सेट से संदर्भ डेटा, को भरने के लिए:एसक्यूएल सर्वर मर्ज + में शामिल होने से अन्य तालिकाओं

MERGE INTO dbo.[User] AS TARGET 
USING (VALUES 
    ('[email protected]', 'My Name')) 
AS SOURCE(UserName, FullName) 
ON SOURCE.UserName = TARGET.UserName 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (UserId, UserName, FullName) 
    VALUES (NEWID(), UserName, FullName); 

समस्या में जब मैं चाहता हूँ आता है अन्य तालिकाओं में सामग्री के आधार पर द्वितीयक तालिका को पॉप्युलेट करने के लिए। उदाहरण के लिए, मेरी UserPermission तालिका में उपयोगकर्ता आईडी और रोल आईडी होती है और मैं चाहता हूं कि मेरा स्थिर मान कुछ '([email protected]', 'Admin') जैसा हो और उपयोगकर्ता और अनुमति प्राप्त करने में सक्षम हो INSERTING के लिए आईडी मान। सुनिश्चित नहीं हैं कि जहां कि करने के लिए क्या ...

संपादित करें:

उपयोगकर्ता तालिका (आईडी, उपयोगकर्ता नाम) 1, जॉन स्मिथ 2, मार्क Wahlerg

भूमिका तालिका (आईडी, RoleName) 1, प्रशासक 2, उपयोगकर्ता 3, अतिथि

उपयोगकर्ता-रोल तालिका (यूज़र आईडी, भूमिका ID)

मैं adju मर्ज बयान के लिए एसक्यूएल चाहते सेंट उपयोगकर्ता-रोल तालिका इस तरह मैं की तरह कुछ निर्दिष्ट कर सकते हैं कि:

USING(VALUES 
('John Smith', 'Administrator'), 
('Mark Wahlburg', 'User') 

और यह, आईडी निर्धारित करने के लिए शामिल होने के संयोजन है कि न मौजूद है (और शायद लोगों को करना है कि हटाना सम्मिलित है, लेकिन नहीं कर रहे हैं होगा मेर्ज में

समाधान:

WITH CTE AS 
(
    SELECT UserId, RoleId 
    FROM (VALUES 
     ('John Smith', 'Administrator'), 
     ('Mark Wahlburg', 'User')) 
     AS SOURCE(UserName, RoleName) 
    INNER JOIN User ON SOURCE.UserName = User.UserName 
    INNER JOIN Role ON SOURCE.RoleName = Role.RoleName 
) 
MERGE INTO UserRole AS TARGET 
USING CTE 
ON CTE.UserId = TARGET.UserID AND CTE.RoleId = TARGET.UserId 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT(UserId, RoleId) 
    VALUES(UserId, RoleId) 
+0

बस उत्सुक, आप यहां बहुत आसान 'INSERT ... SELECT' के बजाय मेर्ज का उपयोग क्यों कर रहे हैं? मैं यह नहीं कह रहा हूं कि आप इसे 'मेर्ज' के साथ नहीं कर सकते हैं, लेकिन ऐसा लगता है कि इस तरह के एक छोटे ऑपरेशन के लिए ओवरकिल लगता है। –

+0

@AaronBertrand, यह एक सरल उदाहरण है, आम तौर पर मेरे पास कई पंक्तियां होती हैं और अद्यतन का उपयोग करती हैं और मेरजे की क्षमता को हटाती हैं। मैं समस्या को अलग करने की कोशिश कर रहा था। – Rich

+0

समस्या आपके 'USING' खंड में है। आपके पास बस हार्ड कोड कोड हैं; यदि आपको उन मानों को किसी तालिका से आकर्षित करने की आवश्यकता है तो आपको वास्तव में 'SELECT' का उपयोग करने की आवश्यकता है। इसके अलावा कुछ सुंदर स्मार्ट लोग हैं जो आपकी समस्याओं का समाधान करने में मदद कर सकते हैं, लेकिन वे आपकी वास्तविक समस्या को हल करने में बहुत अधिक रुचि रखते हैं - इसे नीचे डालने से मुझे अनावश्यक प्रश्नों की ओर ले जाता है जैसे मैंने पूछा। –

उत्तर

8

मर्ज, सीटीई तो शायद आप अपने स्रोत के रूप में उपयोग कर सकते हैं का समर्थन करता है अपने स्थिर डेटा के संयोजन और किसी भी प्रदर्शन CTE भीतर मिलती है।

+1

वह चाल थी।सीटीई और टेबल वैल्यू कन्स्ट्रक्टर के साथ मेरा अनुभव थोड़ा कमजोर था, इसलिए मुझे नहीं पता कि उनका उपयोग कहां किया जा सकता है (और एक साथ उपयोग किया जाता है)। – Rich

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