Chèn với OUTPUT tương quan với bảng truy vấn phụ


22

Tôi đang sửa đổi cấu trúc của một cơ sở dữ liệu. Nội dung của một số cột của bảng FinancialInstlation phải được chuyển vào bảng Person . FinancialInstlation được liên kết với Người có khóa ngoại. Mỗi FinancialInstlation cần Id của Người tương ứng. Vì vậy, đối với mỗi dòng mới được chèn vào Person, id của dòng mới này (IDENTITY) phải được sao chép lại vào dòng FinancialInstlation tương ứng.

Cách rõ ràng để làm điều này là một mã T-SQL lặp. Nhưng tôi muốn biết liệu có thể làm điều đó chỉ với các hoạt động dựa trên tập hợp hay không.

Tôi tưởng tượng mức độ bên trong của một yêu cầu như vậy sẽ giống như:

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;

Thật không may, có vẻ như OUTPUT không thể tương quan theo cách đó ...


Bạn có muốn chèn hàng vào bảng Personkhông? Hoặc cập nhật những cái hiện có? Hay bạn muốn chèn vào Personvà sau đó UPDATE FinancialInstitution?
ypercubeᵀᴹ

Truy vấn của bạn chỉ cập nhật bảng Person. Bạn có thể nắm bắt được insert.ID, nhưng không phải là FinancialInstlation.ID trừ khi bạn sử dụng nó trong phần chèn. Cách truy vấn của bạn, nếu bạn loại bỏ mệnh đề OUTPUT, bạn sẽ gặp lỗi vì số lượng cột trong câu lệnh INSERT của bạn không khớp với câu lệnh SELECT.
datagod

ypercube: Tôi muốn chèn vào Person và sau đó cập nhật FinancialInstlation với Id của hàng mới trong Person.
Yugo Amaryl

datagod: Tôi biết nó chỉ cập nhật, truy vấn này là mức lồng nhau của giải pháp trong tương lai. Nhưng tôi đã bị mắc kẹt ở đó. Phải tôi không thể thêm Id vào lựa chọn nếu tôi không chèn nó.
Yugo Amaryl

Câu trả lời:


18

Tôi đoán bạn có thể (ab) sử dụng MERGEcho việc này. Đầu tiên tạo bảng (tạm thời):

CREATE TABLE tempIDs
( PersonId INT, 
  FinancialInstitutionId INT
) ;

Sau đó MERGEvào Person(thay vì INSERT), vì vậy bạn có thể sử dụng các cột của các bảng liên quan đến OUTPUTmệnh đề:

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 ;

Sau đó sử dụng bảng tạm thời để UPDATE FinancialInstitution:

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

Kiểm tra tại: SQL-Fiddle

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.