2013-11-04 68 views
0

我是很新的SQL,並正在尋找一些幫助者的一個程序,我想在SQL Server寫入2005SQL插入/更新表結果

我試圖插入或者用查詢結果更新表格。

我寫了插入罰款,並按預期工作,但如果記錄已存在,我想更新而不是插入。

我當前的代碼是:

INSERT INTO testTable 
    (field1 , 
     field2 , 
     field3, 
     field4, 
     field5 , 
    )         
select 
    'A000001' 
    table2.field2, 
    GETDATE() , 
    GETDATE() , 
    NULL , 
    NULL , 
    0 

from 
    table1 
INNER JOIN 
    table2 ON table1.field1 = table2.field1 
INNER JOIN 
    table3 ON table2.field1 = table3.field1 
INNER JOIN 
    table4 ON table3.field1 = table4.field1 
WHERE condition 

我想改變這種做法,如果field2從選擇已經在testTable那麼就會更新,而不是插入。我不確定如何做到這一點,因爲我可能會返回多個記錄。

我已經看一些其他的問題,但我沒有找到答案的問題(或我不知道如何更改多個記錄答案)

任何幫助表示讚賞!

感謝,

+0

SQL Server 2008引入了'MERGE'。不幸的是,2008年之前只有很差的選項涉及多個語句(但應該可以通過搜索sql server 2005 merge或sql server 2005 upsert找到) –

+0

我已經看過upserts,但這意味着我需要從我的語句再次,我不確定這是否正確。如果有多個記錄被返回,這會導致問題? – user2952149

+0

如果查詢的select部分很貴,則可以將'select'的結果存儲在臨時表/表變量中。 –

回答

0

INSERT

INSERT INTO testTable 
    (field1 , 
     field2 , 
     field3, 
     field4, 
     field5 , 
    )         
select 
    'A000001' 
    field2, 
    GETDATE() , 
    GETDATE() , 
    NULL , 
    NULL , 
    0 

from 
    table1 
INNER JOIN 
    table2 ON table1.field1 = table2.field1 
INNER JOIN 
    table3 ON table2.field1 = table3.field1 
INNER JOIN 
    table4 ON table3.field1 = table4.field1 
WHERE condition and not exists(select * from testable where table1.field2=testable.field2) 

UPDATE

UPDATE test 
SET 
    test.field1='A000001' 
    test.field3=GETDATE() , 
    test.field4=NULL , 
    test.field5=0 

from 
    testtable as test inner join table1 on test.field2=table1.field2 
INNER JOIN 
    table2 ON table1.field1 = table2.field1 
INNER JOIN 
    table3 ON table2.field1 = table3.field1 
INNER JOIN 
    table4 ON table3.field1 = table4.field1 
WHERE condition 
+0

抱歉,我應該讓自己的問題更清楚一點,我知道如何編寫更新功能,它只是解決什麼時候更新以及何時插入我正在努力。 – user2952149

+0

我寫的代碼將處理何時插入和何時更新 – Madhivanan

0

最好的操作就是使用合併。

;with blabla as (select 
    'A000001' 
    field2, 
    GETDATE() , 
    GETDATE() , 
    NULL , 
    NULL , 
    0 

from 
    table1 
INNER JOIN 
    table2 ON table1.field1 = table2.field1 
INNER JOIN 
    table3 ON table2.field1 = table3.field1 
INNER JOIN 
    table4 ON table3.field1 = table4.field1 
) 
merge into test as target 
using (select * from blabla) as sources (columnlist...) 
on field2 = field2 
WHEN MATCHED and Source.Field2 <> Target.Field2 THEN 
    UPDATE SET ... 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (..) VALUES (..) 
WHEN NOT MATCHED BY Source THEN 
DELETE; 
+0

從OPs問題:「我試圖在SQL Server 2005中編寫。」 –

+0

我正在使用SQL Server 2005,所以這不是我擔心的選項 – user2952149