2009-12-04 38 views
1

我想從其他選擇的表中更新表(存儲)的兩個領域,但我不知道我能做到這一點。 SQL系統是在AS/400,所以沒有SQL Server或Oracle技巧:(從一個選擇的SQL更新

這裏是SELECT,我想訂單的價格和金額(文章表加入只選擇現有的文章)

SELECT OrderDetails.Price, OrderDetails.Amount 
FROM (OrderHeader JOIN OrderDetails ON OrderHeader.Number = OrderDetails.Number) 
JOIN Articles ON Article.Reference = OrderDetails.Article 
WHERE OrderHeader.Store = '074' 
AND OrderHeader.Date = '2009-12-04' 
AND OrderHeader.Number = 26485 

這裏是UPDATE,我想更新的價格和每一篇文章的數量從去年SELECT

UPDATE Store 
SET Store.Price = *****OrderDetails.Price***** 
, Store.Amount = Store.Amount + *****OrderDetails.Amount***** 
... ???? 

感謝您的幫助,並原諒我泰山的英語;)

+2

如果商店對它有多個訂單和/或訂單有多個詳細信息,您如何決定使用哪個值?湯姆,好點, – 2009-12-04 18:45:25

+0

。如果可以修改select以保證只返回一個值,則答案可以是udpate中的子查詢。 – 2009-12-07 15:23:22

回答

0

如果您有驅動程序,可以通過鏈接服務器查詢執行此更新,即SQL Server可以將AS/400添加爲鏈接服務器並對該文件執行更新,我們擁有帶DB2的AS400,經常做通過SQL Server存儲過程更新,但是你必須做一個選擇第一個,然後運行您的更新(這是供應商特定的 - IBM AS/400 W/DB2和SQL 05)

Declare @tmpSql nvarchar(1000); 
Declare @baseSql nvarchar(1000); 

-- Select 
Set @tmpsql = '''Select * From MyAs400Library.file1 where Field1=''''' + @somevariable + ''''' and Field2='+ @someothervariable + '''' 

Set @baseSql = 'Update OpenQuery(LINKEDSERVERNAME,' + @tmpSql + ')' 

Set @baseSql = @baseSql + ' SET Field3='''+ @somevariable + ''' where Field1=''' + @somevariable + ''' and Field2='+ @someothervariable + '' 

exec sp_executesql @baseSql 

所以基本上你」重新做一個選擇,然後更新...

不知道一個鏈接服務器是否是一個選項,但這是一種方法。

0

我認爲這應該工作:

UPDATE Store as ST (Price, Amount) = (SELECT OD.Price, ST.Amount + OD.Amount 
             FROM OrderHeader as OH 
             JOIN OrderDetails as OD 
             ON OH.Number = OD.Number 
             JOIN Articles as A 
             ON A.Reference = OD.Article 
             WHERE OH.Store = ST.Store 
             AND OH.Date = '2009-12-04' 
             AND OH.Number = 26485) 
WHERE ST.Store = '074' 
     AND EXISTS (SELECT '1' 
        FROM OrderHeader as OH 
        JOIN OrderDetails as OD 
        ON OH.Number = OD.Number 
        JOIN Articles as A 
        ON A.Reference = OD.Article 
        WHERE OH.Store = ST.Store 
        AND OH.Date = '2009-12-04' 
        AND OH.Number = 26485) 

WHERE EXISTS是防止對NULL結果。我假設Store有一個id列匹配。
這隻有在表格將返回給定選擇標準的一個(且僅有一個)行時纔有效。如果情況並非如此,則需要提供更多細節。