(使用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');
答案 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中,我已复制了您的表格并添加了其他记录STATEROUTE
与NAME
中的某个记录匹配。虽然Fiddle返回错误,但我在Oracle DB中运行它,并且正确更新了一条记录,如下面的屏幕截图所示: