更新PL / SQL中的列

时间:2015-05-26 02:11:46

标签: sql oracle plsql

(使用PL / SQL匿名程序块) 我有墨西哥州高速公路的桌子tblROUTE2:

+-----------------+------------+---------+----------+----------+----------------------------+-----------+--------+
|      TYPE       | ADMN_CLASS | TOLL_RD | RTE_NUM1 | RTE_NUM2 |         STATEROUTE         | LENGTH_KM |  STATE |
+-----------------+------------+---------+----------+----------+----------------------------+-----------+--------+
| Paved Undivided | Federal    | N       |       81 |          | Tamaulipas Federal Hwy  81 | 124.551   |  NULL  |
| Paved Undivided | Federal    | N       |      130 |          | Hidalgo Federal Hwy 130    | 76.347    |  NULL  |
| Paved Undivided | Federal    | N       |      130 |          | Mexico Federal Hwy 130     | 68.028    |  NULL  |
+-----------------+------------+---------+----------+----------+----------------------------+-----------+--------+
墨西哥各州的

和tblSTATE2:

+------+-----------------------+---------+-----------+
| CODE |         NAME          | POP1990 | AREA_SQMI |
+------+-----------------------+---------+-----------+
| MX02 | Baja California Norte | 1660855 | 28002.325 |
| MX03 | Baja California Sur   |  317764 | 27898.191 |
| MX18 | Nayarit               |  824643 | 10547.762 |
+------+-----------------------+---------+-----------+

我需要根据tblROUTE2中的路由名称,使用tblSTATE2中的 CODE 字段更新tblROUTE2中的 STATE 字段。基本上,我需要以某种方式取第一个字符串或两个(一些路由有两个名称) - 在字符串'Federal'之前 - 在tblROUTE2中的 STATEROUTE 字段,并确保它与字符串匹配在tblSTATE2的 NAME 字段中。然后,由于状态与CODE匹配,请在tblROUTE2的 STATE 字段中更新这些代码。

我已经开始了一个代码:

DECLARE
  state_code         
     tblROUTE2.STATE%TYPE;
  state_name   
     tblSTATE2.NAME%TYPE;
BEGIN
  SELECT STATE, NAME
    INTO state_code
    FROM tblROUTE2 r, tblSTATE2 s
   WHERE STATEROUTE LIKE '%Federal';
END;

同样,我需要从路由名称中删除州名。例如, STATEROUTE 'Tamaulipas Federal Hwy'中的字符串变为'Federal Hwy'。我已经启动了一个代码,不确定它是否正确:

UPDATE tblROUTE2
SET STATEROUTE = TRIM(LEADING FROM 'Federal');

1 个答案:

答案 0 :(得分:0)

使用MERGE更新:

MERGE INTO tblROUTE2 A
USING
(
    SELECT CODE, NAME  FROM tblSTATE2
) B 
ON 
(
    upper(SUBSTR(A.STATEROUTE, 0, INSTR(UPPER(A.STATEROUTE), UPPER('FEDERAL'))-2)) = upper(B.NAME)
)
WHEN MATCHED THEN UPDATE 
    SET A.STATE = B.CODE;

FIDDLE中,我已复制了您的表格并添加了其他记录STATEROUTENAME中的某个记录匹配。虽然Fiddle返回错误,但我在Oracle DB中运行它,并且正确更新了一条记录,如下面的屏幕截图所示:

enter image description here