oracle sql比较两列,如果匹配更新id_value循环

时间:2015-02-26 15:38:41

标签: sql oracle sql-update

我是Oracle SQL的新手,我很遗憾谁比较两个不同表中的两个列;与表A和表B中的last_name和first_name一样,如果两个表中的colums vlaues都匹配,则将表B中的value_id更新为表A.

1 个答案:

答案 0 :(得分:0)

这应该使用MERGE声明来完成 让我们构建一些示例数据:

CREATE TABLE TABLE_A (VALUE_ID INTEGER, LAST_NAME VARCHAR2(15), FIRST_NAME VARCHAR2(15));
CREATE TABLE TABLE_B (VALUE_ID INTEGER, LAST_NAME VARCHAR2(15), FIRST_NAME VARCHAR2(15));
INSERT INTO TABLE_A (VALUE_ID, LAST_NAME, FIRST_NAME)
VALUES (1, 'SMITH', 'JOHN');
INSERT INTO TABLE_A (VALUE_ID, LAST_NAME, FIRST_NAME)
VALUES (2, 'ADAMS', 'JOHN');
INSERT INTO TABLE_A (VALUE_ID, LAST_NAME, FIRST_NAME)
VALUES (3, 'ADAMS', 'SAM');
INSERT INTO TABLE_B (VALUE_ID, LAST_NAME, FIRST_NAME)
VALUES (4, 'BOOTH', 'JOHN');
INSERT INTO TABLE_B (VALUE_ID, LAST_NAME, FIRST_NAME)
VALUES (5, 'HENRY', 'JOHN');
INSERT INTO TABLE_B (VALUE_ID, LAST_NAME, FIRST_NAME)
VALUES (6, 'ADAMS', 'SAM');

现在在那里:

SQL> select * from table_a;

  VALUE_ID LAST_NAME       FIRST_NAME
---------- --------------- ---------------
         1 SMITH           JOHN
         2 ADAMS           JOHN
         3 ADAMS           SAM

SQL> select * from table_b;

  VALUE_ID LAST_NAME       FIRST_NAME
---------- --------------- ---------------
         4 BOOTH           JOHN
         5 HENRY           JOHN
         6 ADAMS           SAM

SQL>

现在让MERGE他们在一起:

MERGE INTO TABLE_A A
USING (
  SELECT B.VALUE_ID, B.FIRST_NAME, B.LAST_NAME
  FROM TABLE_B b) b
ON (B.FIRST_NAME = A.FIRST_NAME AND B.LAST_NAME = A.LAST_NAME) 
WHEN MATCHED THEN UPDATE SET VALUE_ID=b.VALUE_ID
;

现在在那里?

SQL> select * from table_a;

  VALUE_ID LAST_NAME       FIRST_NAME
---------- --------------- ---------------
         1 SMITH           JOHN
         2 ADAMS           JOHN
         6 ADAMS           SAM

SQL> select * from table_b;

  VALUE_ID LAST_NAME       FIRST_NAME
---------- --------------- ---------------
         4 BOOTH           JOHN
         5 HENRY           JOHN
         6 ADAMS           SAM

SQL>

因此,我们MERGE VALUE_ID进入TABLE_A,其中FIRST_NAMELAST_NAME位于两个表格中。