मैं एक डेटाबेस परियोजना के भीतर मर्ज बयान उपयोग कर रहा हूँ नीचे निम्नलिखित जैसे एक स्थिर मूल्य सेट से संदर्भ डेटा, को भरने के लिए:एसक्यूएल सर्वर मर्ज + में शामिल होने से अन्य तालिकाओं
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)
बस उत्सुक, आप यहां बहुत आसान 'INSERT ... SELECT' के बजाय मेर्ज का उपयोग क्यों कर रहे हैं? मैं यह नहीं कह रहा हूं कि आप इसे 'मेर्ज' के साथ नहीं कर सकते हैं, लेकिन ऐसा लगता है कि इस तरह के एक छोटे ऑपरेशन के लिए ओवरकिल लगता है। –
@AaronBertrand, यह एक सरल उदाहरण है, आम तौर पर मेरे पास कई पंक्तियां होती हैं और अद्यतन का उपयोग करती हैं और मेरजे की क्षमता को हटाती हैं। मैं समस्या को अलग करने की कोशिश कर रहा था। – Rich
समस्या आपके 'USING' खंड में है। आपके पास बस हार्ड कोड कोड हैं; यदि आपको उन मानों को किसी तालिका से आकर्षित करने की आवश्यकता है तो आपको वास्तव में 'SELECT' का उपयोग करने की आवश्यकता है। इसके अलावा कुछ सुंदर स्मार्ट लोग हैं जो आपकी समस्याओं का समाधान करने में मदद कर सकते हैं, लेकिन वे आपकी वास्तविक समस्या को हल करने में बहुत अधिक रुचि रखते हैं - इसे नीचे डालने से मुझे अनावश्यक प्रश्नों की ओर ले जाता है जैसे मैंने पूछा। –