在具有不同价值的多行上更新同一列

时间:2017-10-11 14:05:15

标签: sql oracle

以下是一个例子。手动创建表1,其中前三个列是从外部文件加载的。第四列(SHOWROOM_ID)将取自TABLE2,表1中的其余列将根据标准进行更新。

表1

NAME     |OLD_CPR_NO |OLD_COS_NO |SHOWROOM_ID|NM_CPR_COS_MAT|NM_CPR_MAT|COS_CPR_MAT|
------------------------------------------------------------------------------------
FORD     | 45        | 487       |           |              |          |    
TOYOTA   | 78        | 562       |           |              |          |
BENZ     | 55        | 789       |           |              |          |
JEEP     | 66        | 124       |           |              |          |
HONDA    | 34        | 142       |           |              |          |
KIA      | 12        | 962       |           |              |          |
GM       | 89        | 7787      |           |              |          |
CHRYSLER | 45        | 236       |           |              |          |
AUDI     | 67        | 4789      |           |              |          |

表2

PK|NAME     |OLD_CPR_NO |OLD_COS_NO |SHOWROOM_ID
---------------------------------------------
1  |FORD     | 45        | 487       |   1    
2  |TOYOTA   | 78        | 562       |   2   
3  |CIAT     | 55        | 789       |   3     
4  |JEEP     | 66        | 124       |   5    
5  |HONDA    | 34        | 456       |   6   
6  |MUSTANG  | 12        | 962       |   7   
7  |GM       | 89        | 56        |   8   
8  |CHRYSLER | 45        | 236       |   9   
9  |AUDI     | 67        | 4789      |   10  

第1步: Update NM_CPR_COS_MAT column from table 1。这是一个指标字段,NAME,OLD_CPR_NO,OLD_COS_NO匹配表1和表2,然后指定指标'Y'

我能够根据以下查询获得结果:

UPDATE TABLE_1 TAB1
SET NM_CPR_COS_MAT = (SELECT 'Y'
FROM 
TABLE_2 TAB2
WHERE
TRIM(TAB1.NAME) = TRIM(TAB2.NAME)
AND TRIM(TAB1.OLD_CPR_NO) = TRIM(TAB2.OLD_CPR_NO)
AND TRIM(TAB1.OLD_COS_NO) = TRIM(TAB2.OLD_COS_NO)
;
COMMIT;

UPDATE TABLE_1 TAB1
SET SHOWROOM_ID= (SELECT TAB2.SHOWROOM_ID
FROM 
TABLE_2 TAB2
WHERE
TRIM(TAB1.NAME) = TRIM(TAB2.NAME)
AND TRIM(TAB1.OLD_CPR_NO) = TRIM(TAB2.OLD_CPR_NO)
AND TRIM(TAB1.OLD_COS_NO) = TRIM(TAB2.OLD_COS_NO)
AND TRIM(TAB1.NM_CPR_COS_MAT) = 'Y'
;
COMMIT;

结果:

TABLE 1
NAME     |OLD_CPR_NO |OLD_COS_NO |SHOWROOM_ID|NM_CPR_COS_MAT|NM_CPR_MAT|COS_CPR_MAT|
------------------------------------------------------------------------------------
FORD     | 45        | 487       |      1    |       Y      |          |    
TOYOTA   | 78        | 562       |      2    |       Y      |          |
BENZ     | 55        | 789       |           |              |          |
JEEP     | 66        | 124       |      5    |       Y      |          |
HONDA    | 34        | 142       |           |              |          |
KIA      | 12        | 962       |           |              |          |
GM       | 89        | 7787      |           |              |          |
CHRYSLER | 45        | 236       |     9     |       Y      |          |
AUDI     | 67        | 4789      |     10    |      Y       |          |

从下面生成的表格中,我必须再次UPDATE SHOWROOM_ID columnNM_CPR_MAT

TABLE 1
NAME     |OLD_CPR_NO |OLD_COS_NO |SHOWROOM_ID|NM_CPR_COS_MAT|NM_CPR_MAT|COS_CPR_MAT|
------------------------------------------------------------------------------------
FORD     | 45        | 487       |      1    |       Y      |          |    
TOYOTA   | 78        | 562       |      2    |       Y      |          |
BENZ     | 55        | 789       |           |              |          |
JEEP     | 66        | 124       |      5    |       Y      |          |
HONDA    | 34        | 142       |           |              |          |
KIA      | 12        | 962       |           |              |          |
GM       | 89        | 7787      |           |              |          |
CHRYSLER | 45        | 236       |     9     |       Y      |          |
AUDI     | 67        | 4789      |     10    |      Y       |          |

STEP 2:
UPDATE TABLE_1 TAB1
SET NM_CPR_MAT = (SELECT 'Y'
FROM 
TABLE_2 TAB2
WHERE
TRIM(TAB1.NAME) = TRIM(TAB2.NAME)
AND TRIM(TAB1.OLD_CPR_NO) = TRIM(TAB2.OLD_CPR_NO)
AND TRIM(NM_CPR_COS_MAT) IS NULL
;
COMMIT;

UPDATE TABLE_1 TAB1
SET SHOWROOM_ID= (SELECT TAB2.SHOWROOM_ID
FROM 
TABLE_2 TAB2
WHERE
WHERE
TRIM(TAB1.NAME) = TRIM(TAB2.NAME)
AND TRIM(TAB1.OLD_CPR_NO) = TRIM(TAB2.OLD_CPR_NO)
AND TRIM(NM_CPR_COS_MAT) IS NULL
AND TRIM(NM_CPR_MAT) = 'Y'
;
COMMIT;

我获得了以下结果。我正在NM_CPR_MAT列中获得正确的'Y'以及SHOWROOM_ID中的正确数字,以获取新的更新声明,但是在<{1}}中更新的数字< strong>以前的更新声明已经消失。

TABLE 1
NAME     |OLD_CPR_NO |OLD_COS_NO |SHOWROOM_ID|NM_CPR_COS_MAT|NM_CPR_MAT|COS_CPR_MAT|
------------------------------------------------------------------------------------
FORD     | 45        | 487       |           |       Y      |          |    
TOYOTA   | 78        | 562       |           |       Y      |          |
BENZ     | 55        | 789       |           |              |          |
JEEP     | 66        | 124       |           |       Y      |          |
HONDA    | 34        | 142       |      6    |              |    Y     |
KIA      | 12        | 962       |           |              |          |
GM       | 89        | 7787      |      8    |              |    Y     |
CHRYSLER | 45        | 236       |           |      Y       |          |
AUDI     | 67        | 4789      |           |      Y       |          |

1 个答案:

答案 0 :(得分:0)

很难确定何时发布了格式错误的SQL,但似乎两个查询都会更新整个表格。如果子查询条件与tab2中的任何内容不匹配,则更新将指定null。所以第二个查询会覆盖第一个查询的结果。

您可以通过向第二个更新语句添加WHERE条件来轻松解决此问题:

where SHOWROOM_ID is null