सब क्वेरी तालिका से संबंधित OUTPUT के साथ सम्मिलित करें


22

मैं एक डेटाबेस की संरचना को संशोधित कर रहा हूं। तालिका FinancialInsteration के कई स्तंभों की सामग्री को तालिका व्यक्ति में स्थानांतरित किया जाना है । फाइनेंशियल इनस्टीट्यूशन एक विदेशी कुंजी के साथ व्यक्ति से जुड़ा हुआ है। प्रत्येक FinancialInstitution को अपने संबंधित व्यक्ति की Id की आवश्यकता होती है। इसलिए, पर्सन में डाली गई प्रत्येक नई लाइन के लिए, इस नई लाइन (IDENTITY) की आईडी को FinancialInsteration की संबंधित लाइन में वापस कॉपी करना होगा।

ऐसा करने का स्पष्ट तरीका एक पुनरावृत्त टी-एसक्यूएल कोड है। लेकिन मुझे यह जानने में दिलचस्पी है कि क्या यह केवल सेट-आधारित संचालन के साथ करना संभव है।

मैंने सोचा कि इस तरह के अनुरोध का आंतरिक स्तर कुछ इस तरह होगा:

INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1)
OUTPUT inserted.Id, FinancialInstitution.Id
SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email
FROM FinancialInstitution;

दुर्भाग्य से, ऐसा लगता है कि OUTPUT उस तरह से सहसंबंधित नहीं कर सकता ...


क्या आप तालिका में पंक्तियाँ सम्मिलित करना चाहते हैं Person? या मौजूदा अपडेट करें? या आप में सम्मिलित करना चाहते हैं Personऔर उसके बाद UPDATE FinancialInstitution?
ypercube y

आपकी क्वेरी केवल व्यक्ति तालिका अपडेट कर रही है। जब तक आप इसे सम्मिलित हिस्से में उपयोग नहीं करते हैं, आप सम्मिलित कर सकते हैं। जिस तरह से आपकी क्वेरी बैठती है, यदि आपने OUTPUT क्लॉज को हटा दिया, तो आपको एक त्रुटि मिलेगी क्योंकि आपके INSERT स्टेटमेंट में कॉलम की संख्या SELECT स्टेटमेंट से मेल नहीं खाती है।
डेटागोड

ypercube: मैं व्यक्ति में सम्मिलित करना चाहता हूं और फिर व्यक्ति में नई पंक्ति की आईडी के साथ FinancialInstitution अपडेट करें।
युगो अमिरल

डेटागोड: मुझे पता है कि इसका एकमात्र अद्यतन है, यह क्वेरी भविष्य के समाधान का नेस्टेड स्तर है। लेकिन मैं वहां पहले से ही फंस गया हूं। यदि मैं इसे सम्मिलित नहीं करता, तो मैं चयन में आईडी नहीं जोड़ सकता।
युगो अमिरल

1
@ युगोअमेरिल, आप इस उदाहरण को अपनाने की कोशिश कर सकते हैं मल्टी-रो आवेषण पर पहचान मानों को कैप्चर करने के लिए OUTPUT क्लॉज का उपयोग कर
DenisT

जवाबों:


18

मुझे लगता है कि आप (ab) इसके लिए उपयोग कर सकते हैं MERGE। पहले एक (अस्थायी) तालिका बनाएँ:

CREATE TABLE tempIDs
( PersonId INT, 
  FinancialInstitutionId INT
) ;

फिर MERGEमें Person(बजाय INSERT) है, तो आप में शामिल तालिकाओं के स्तंभों का उपयोग कर सकते हैं OUTPUTखंड:

MERGE INTO Person 
USING FinancialInstitution AS fi
  ON 1 = 0
WHEN NOT MATCHED THEN
  INSERT (Street1, Number1, City1, ...)
  VALUES (fi.Street, fi.Number, fi.City, ...)
OUTPUT inserted.Id, fi.Id
  INTO tempIDs ;

फिर टेंपरेचर टेबल का उपयोग करें UPDATE FinancialInstitution:

UPDATE fi
SET fi.PersonId = t.PersonId
FROM FinancialInstitution AS fi
  JOIN tempIDs AS t
    ON fi.Id = t.FinancialInstitutionId ; 

टेस्ट: एसक्यूएल-फिडल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.