2011-05-05 48 views
0

我不知道是否有可能做一些這樣的:更新柱基上另一列

UPDATE SomeTable st 
    SET MyColumn1 = (SELECT SomeValue 
        FROM WhereverTable), 

     MyColumn2 = ((SELECT AnotherValue 
        FROM AnotherTable) 
        * 
        MyColumn1); 
WHERE MyColumn4 = 'condition' 

我在想,當我乘AnotherValueMyColumn1,它仍然有舊值的MyColumn1而不是新的應該是SomeValue

我正在使用DB2,如果這很重要。

+0

表格如何關聯?其他表格中是否有多於一排? – 2011-05-05 21:36:37

+0

SomeTable,WhereverTable和AnotherTable都是不相關的。您可以假定SELECT語句全部只返回一個值。我唯一的問題是更新MyColumn2 – 2011-05-05 21:43:52

回答

0

沒有比這更具體的細節,很難給你一個堅實的答案。但我會採取刺:

UPDATE SomeTable 
     SET MyColumn1 = wt.SomeValue 
      MyColumn2 = at.AnotherValue 
     FROM SomeTable st 
CROSS JOIN (
       SELECT SomeValue FROM WhereverTable 
      ) wt 
CROSS JOIN (
       SELECT AnotherValue FROM AnotherTable 
      ) at 
WHERE MyColumn4 = 'condition' 

如果他們真的沒有關係,那麼CROSS JOIN就是你想要的。但要注意,交叉連接的子查詢(在本例中爲wtat)只需要其中有1條記錄,或者JOIN會在FROM子句中生成多條記錄。不知道這個查詢會做什麼,但它可能會使結果集不可更新。

請注意,我正在使用SQL Server的T-SQL語法,因爲這是我更熟悉的。但是快速谷歌發現DB2確實支持交叉連接(請參閱here)。

1

使用MyColumn1的原始值計算乘法表達式,而不是更新中指定的值。如果您想在乘法公式中使用MyColumn1的新值,那麼也可以在那裏指定新的表達式。此外,您應該在子查詢中放置MIN,MAX或FETCH FIRST ROW,以防止返回多行。

+0

因此,沒有辦法指定某種類型的臨時變量來保存MyColumn1的值?在存儲過程中如何? – 2011-05-05 22:11:50

+0

複合SQL語句將允許您聲明變量而不創建存儲過程。 – 2011-05-06 18:24:52

0

嘗試此(未測試):

UPDATE SomeTable 
    SET MyColumn1 = (SELECT SomeValue 
        FROM WhereverTable), 

     MyColumn2 = MyColumn1 * (SELECT AnotherValue 
           FROM AnotherTable) 
WHERE MyColumn4 = 'condition'; 

本標準SQL-92語法要求標量子查詢即兩個WhereverTableAnotherTable必須將每個包括零個或一個行。更常見的情況是,這些行需要在子查詢中使用標識符(或條件或類似)進行「關聯」,並且在UPDATE陳述中的SET子句和WHERE子句中都這樣做,例如, (SQL-92,未經測試):

UPDATE SomeTable 
    SET MyColumn1 = (
        SELECT wt.SomeValue 
         FROM WhereverTable AS wt 
        WHERE wt.some_table_ID = SomeTable.some_table_ID 
        ), 
     MyColumn2 = MyColumn1 * (
           SELECT av.AnotherValue 
            FROM AnotherTable AS av 
           WHERE wt.another_table_ID = SomeTable.another_table_ID 
           ) 
WHERE MyColumn4 = 'condition' 
     AND EXISTS (
        SELECT * 
        FROM WhereverTable AS wt 
        WHERE wt.some_table_ID = SomeTable.some_table_ID 
       ) 
     OR EXISTS (
        SELECT * 
        FROM AnotherTable AS av 
        WHERE wt.another_table_ID = SomeTable.another_table_ID 
       ); 

這可以通過使用SQL-99的MERGE聲明給少 '重複' 的代碼重寫。

0

假設表總是返回一個(且僅一個)一行,下面的應該只是罰款:

UPDATE SomeTable st SET (MyColumn1, MyColumn2) = (SELECT SomeValue, 
                 AnotherValue * MyColumn1 
                FROM WhereverTable wt 
                CROSS JOIN AnotherTable at) 
WHERE MyColumn4 = 'condition' 

根據需要(使用MyColumn1舊值),這將更新MyColumn2
顯然,如果有更多/可選的行,事情會變得更加複雜。