Alt sorgu tablosu ile ilişkilendirilmiş OUTPUT ile ekle


22

Bir veritabanının yapısını değiştiriyorum. Finansal Kurum tablosunda yer alan birçok sütunun içeriği, Masa tablosuna taşınmalıdır . Mali Kurum, yabancı bir anahtara sahip Kişi ile bağlantılıdır. Her bir Mali Kurum, ilgili Kişinin kimliğine ihtiyaç duyar. Dolayısıyla, Kişiye eklenen her yeni satır için, bu yeni satırın kimliği (KİMLİK) karşılık gelen Finansal Kurum satırına kopyalanmalıdır.

Bunu yapmanın en açık yolu yinelemeli bir T-SQL kodudur. Ancak bunu yalnızca set tabanlı işlemlerle yapmanın mümkün olup olmadığını bilmekle ilgileniyorum.

Böyle bir isteğin iç düzeyinin şöyle bir şey olacağını hayal ettim:

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;

Ne yazık ki, ÇIKIŞ bu şekilde ilişki kuramıyor gibi görünüyor ...


Tabloya satır eklemek ister misiniz Person? Veya mevcut olanları güncellemek? Yoksa içine Personve sonra eklemek ister misiniz UPDATE FinancialInstitution?
ypercubeᵀᴹ

Sorgunuz yalnızca Kişi tablosunu güncelliyor. Eklenen kısımda kullanmazsanız, insert.ID'yi yakalayabilirsiniz ancak FinancialInstitution.ID'yi yakalayamazsınız. Sorgunuzun oturduğu şekilde, OUTPUT yan tümcesini kaldırırsanız, INSERT ifadenizdeki sütun sayısı SELECT ifadesiyle eşleşmediğinden bir hata alırsınız.
datagod

ypercube: Kişi'ye Eklemek ve ardından Kişi içindeki yeni satırın Kimliği ile Finansal Kurulumu Güncellemek istiyorum.
Yugo Amaryl

datagod: Tek güncelleme olduğunu biliyorum, bu sorgu gelecekteki çözümün iç içe geçmiş seviyesidir. Ama ben zaten oraya sıkışıp kaldım. Doğru, eklemediğimde seçime Id ekleyemiyorum.
Yugo Amaryl

1
@YugoAmaryl, bu örneği benimsemeye çalışabilirsiniz Çok Sıralı Eklemelerde Kimlik Değerlerini Yakalamak için ÇIKIŞ
DenisT

Yanıtlar:


18

Sanırım bunun için kullanabilirsiniz (ab) MERGE. İlk önce (geçici) bir tablo oluşturun:

CREATE TABLE tempIDs
( PersonId INT, 
  FinancialInstitutionId INT
) ;

Daha MERGEsonra Person(yerine INSERT), bu cümleyle ilgili tabloların sütunlarını kullanabilirsiniz 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 ;

Sonra geçici tabloyu kullanarak UPDATE FinancialInstitutionşunları yapın :

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

Test at: SQL-Fiddle

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.