2012-01-30 40 views
3

基本上我有一個與下表具有相似格式的表。SQL UPDATE語句根據另一個現有行更新列

我想要做的就是更新COL4基於這個邏輯

  • 如果col2的爲null,則與COL3更新COL4
  • 如果col2的是不爲空,然後找到Col1中該值相匹配的值在Col2中。在COL3

與相應的值更新COL4例如,給定此表:

| Col1 | Col2 | Col3 | Col4 | 
----------------------------- 
| 1 | 2 | A1 | 2 | 
----------------------------- 
| 2 | 3 | A2 | 3 | 
----------------------------- 
| 3 |{null}| A3 |{null}| 

更新它是該表

| Col1 | Col2 | Col3 | Col4 | 
----------------------------- 
| 1 | 2 | A1 | A2 | 
----------------------------- 
| 2 | 3 | A2 | A3 | 
----------------------------- 
| 3 |{null}| A3 | A3 | 

任何方向將不勝感激!

+2

哪個DB?你試過什麼了?你看過CASE聲明嗎? – Simon 2012-01-30 14:39:39

+0

我使用MySQL 5.1。我已經嘗試了類似於SQL Server中更新集的邏輯,但無濟於事。我將最終實現一個Case語句,但是我所遇到的問題是在邏輯不爲空時執行邏輯 – mattchong 2012-01-30 14:46:40

+0

您能發佈您已經嘗試過的代碼以及它給出的錯誤嗎? – FrustratedWithFormsDesigner 2012-01-30 15:03:27

回答

1

像這樣的東西應該工作(未經測試):

UPDATE table 
SET  col4 = CASE WHEN table.col2 IS NULL THEN table.col3 ELSE col2Matches.col3 END 
FROM table 
     INNER JOIN table AS col2Matches 
      ON table.col2 = col2Matches.col1 

這應該讓你測試一下:

SELECT CASE WHEN table.col2 IS NULL THEN table.col3 ELSE col2Matches.col3 END 
FROM table 
     INNER JOIN table AS col2Matches 
      ON table.col2 = col2Matches.col1 

希望這有助於

皮特

+0

當Col2爲空時,將其設置爲左外部聯接。 – 2012-01-30 14:58:34

+0

CASE WHEN的第一部分負責Col2爲NULL。由於OP只關心它何時不爲空,所以我將它變成了一個INNER。 – pete 2012-01-30 15:04:57

+0

菲利普是對的。如果我將其作爲內連接,則會丟失第三行。 – mattchong 2012-01-30 15:11:58

0

像這樣的東西可能會在Oracle中工作。

update myTable 
set col4 = case when col2 is null then col3 
       else (select col3 from myTable where col1 = col2) 
      end; 

當然,如果select col3 from myTable where col1 = col2返回多行那麼這個查詢將行不通。但我想你知道你已經知道你的數據是否足夠乾淨,以使其工作。