แทรกด้วย OUTPUT ที่สัมพันธ์กับตารางคิวรีย่อย


22

ฉันกำลังแก้ไขโครงสร้างของฐานข้อมูล เนื้อหาหลายคอลัมน์ของตารางสถาบันการเงินจะต้องมีการโอนเข้ามาในตารางบุคคล FinancialInstitution เชื่อมโยงกับบุคคลที่มีคีย์ต่างประเทศ FinancialInstitution แต่ละรายการต้องการรหัสของบุคคลที่เกี่ยวข้อง ดังนั้นสำหรับแต่ละบรรทัดใหม่ที่แทรกใน Person ID ของบรรทัดใหม่นี้ (IDENTITY) จะต้องถูกคัดลอกกลับไปยังบรรทัดที่เกี่ยวข้องของ FinancialInstit

วิธีที่ชัดเจนในการทำเช่นนี้คือรหัส T-SQL ซ้ำ ๆ แต่ฉันสนใจที่จะรู้ว่ามันเป็นไปได้ที่จะทำเฉพาะกับการดำเนินการตามชุด

ฉันจินตนาการถึงระดับภายในของคำขอดังกล่าวจะเป็นเช่น:

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ᵀᴹ

ข้อความค้นหาของคุณอัปเดตเฉพาะตารางบุคคลเท่านั้น คุณสามารถจับภาพที่แทรก ID ได้ แต่ไม่ใช่ FinancialInstit.ID เว้นแต่ว่าคุณจะใช้มันในส่วนแทรก วิธีที่แบบสอบถามของคุณอยู่ถ้าคุณลบส่วนคำสั่ง OUTPUT คุณจะได้รับข้อผิดพลาดเนื่องจากจำนวนคอลัมน์ในคำสั่ง INSERT ของคุณไม่ตรงกับคำสั่ง SELECT
datagod

ypercube: ฉันต้องการแทรกลงในบุคคลแล้วอัปเดต FinancialInstit ด้วยรหัสของแถวใหม่ในบุคคล
Yugo Amaryl

datagod: ฉันรู้เพียงอัปเดตเท่านั้นแบบสอบถามนี้เป็นระดับที่ซ้อนกันของโซลูชันในอนาคต แต่ฉันติดอยู่ที่นั่นแล้ว ขวาฉันไม่สามารถเพิ่มรหัสลงในส่วนที่เลือกได้ถ้าฉันไม่ใส่มัน
Yugo Amaryl

คำตอบ:


18

ฉันเดาว่าคุณสามารถใช้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 ; 

ทดสอบที่: SQL-Fiddle

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.