2012-01-30 42 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返回多行那么这个查询将行不通。但我想你知道你已经知道你的数据是否足够干净,以使其工作。