2009-02-26 17 views
2

Formüler ilaç bilgilerini depolayan ve her gün merkezi formülerden güncelleştirilmesi gereken bir tablom var. Geçici tablo ilaç tablosuna denktir. Temp tablosu verileri ana tabloya özdeş (ve çoğu günlerde) olabilir veya güncellenmiş satırlar veya yeni satırlar olabilir.Bir tabloyu geçici bir tablodan güncelle

Ana tabloyu güncellemek için saklı yordamım var, ancak NULL satırlarını güncelleştirmeyeceği için başarısız oluyor (geçici tabloda yeni bir satır varsa).

Bu

bir MSSQL Sunucuyu burada yanlış gidiyorum 2005.

geçerli:

-- Insert statements for procedure here 
UPDATE [RX_Billing].[dbo].[FS_Drug] 
SET [TRADENAME] = [RX_Billing].[dbo].[FS_Drug_TEMP].[TRADENAME] 
    ,[CDM] = [RX_Billing].[dbo].[FS_Drug_TEMP].[CDM] 
    ,[NDC] = [RX_Billing].[dbo].[FS_Drug_TEMP].[NDC] 
    ,[IP_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[IP_COST] 
    ,[OP_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[OP_COST] 
    ,[HH_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[HH_COST] 
    ,[VAR_COST] = [RX_Billing].[dbo].[FS_Drug_TEMP].[VAR_COST] 
    ,[LSTUPDATE] = [RX_Billing].[dbo].[FS_Drug_TEMP].[LSTUPDATE] 
FROM [RX_Billing].[dbo].[FS_Drug] 
RIGHT OUTER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] ON 
      [RX_Billing].[dbo].[FS_Drug].[TRADENAME] = 
        [RX_Billing].[dbo].[FS_Drug_TEMP].[TRADENAME] 

DÜZENLEME: Rory'nin koduyla gitti

. Teşekkürler, bu güzel çalışıyor.

Orion Edwards'a bir not: UPSERT/MERGE tam olarak istediğim şeydi, ancak SQL Server 2005 altında desteklenmiyor. Görünüşe göre planlanmıştı, ancak bu sürümü kullanıma almadı. Server 2008'de kullanılabilir. (Interweb'lerin bana söylediği şeyden.)

cevap

10

Standart yolu bir UPDATE ve daha sonra bir INSERT yapmaktır . Bunu UPDATE ile aynı, ancak Tmp.TRADENAME NULL olan bir SOL DIŞ JOIN ile ayrı bir ifade olarak yapın.

2

Yeni satırlarda INSERT ve varolan satırlarda UPDATE yapmak istemez miydiniz? Bunu bir INNER JOIN olarak güncellemek ve ayrı bir INSERT ekleyerek doğru anlıyorsanız sorununuzu çözmeniz gerekir.

3

Bir UPSERT yapmayı deneyebilirsiniz (temel olarak "varsa, güncelleyin, ekleyiniz"). Artık tmp olmayan uyuşturucu herhangi bir kayıt silindi olarak

-- UPDATE rows using an INNER JOIN with matching TRADENAME. No need to update TRADENAME column. 
UPDATE drug 
SET [CDM] = tmp.[CDM] 
    , [NDC] = tmp.[NDC] 
    , [IP_COST] = tmp.[IP_COST] 
    , [OP_COST] = tmp.[OP_COST] 
    , [HH_COST] = tmp.[HH_COST] 
    , [VAR_COST] = tmp.[VAR_COST] 
    , [LSTUPDATE] = tmp.[LSTUPDATE] 
FROM [RX_Billing].[dbo].[FS_Drug] drug 
INNER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp 
    ON drug.[TRADENAME] = tmp.[TRADENAME] 

-- Insert rows that don't have matching TRADENAME 
INSERT INTO drug 
SELECT 
    tmp.[TRADENAME] 
    , tmp.[CDM] 
    , tmp.[NDC] 
    , tmp.[IP_COST] 
    , tmp.[OP_COST] 
    , tmp.[HH_COST] 
    , tmp.[VAR_COST] 
    , tmp.[LSTUPDATE] 
FROM [RX_Billing].[dbo].[FS_Drug] drug 
RIGHT OUTER JOIN [RX_Billing].[dbo].[FS_Drug_TEMP] tmp 
    ON drug.[TRADENAME] = tmp.[TRADENAME] 
WHERE drug.[TRADENAME] IS NULL 

Ayrıca silmek isteyebilirsiniz veya bayrak:

I believe SQL server calls it MERGE

İlgili konular