Oracle11g 如果来自其他两个表的值匹配,则更新来自表的值

Oracle11g 如果来自其他两个表的值匹配,则更新来自表的值,oracle11g,oracle-sqldeveloper,Oracle11g,Oracle Sqldeveloper,我试图更新大约800行,并希望更新表c,使表A和表b中的两个值匹配。表a和表c由值id关联 例如: CREATE TABLE TABLE_A (VALUE_ID INTEGER, PERSON_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), AL

我试图更新大约800行,并希望更新表c,使表A和表b中的两个值匹配。表a和表c由值id关联

例如:

CREATE TABLE TABLE_A (VALUE_ID INTEGER, PERSON_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), ALIAS_ID INTEGER);
CREATE TABLE TABLE_C (VALUE_ID INTEGER, ALIAS_ID INTEGER, PERSON_ID INTEGER);
-----
INSERT INTO TABLE_A (VALUE_ID, PERSON_ID, LAST_NAME, FIRST_NAME)
VALUES (1, 6069, 'SMITH', 'JOHN');
INSERT INTO TABLE_A (VALUE_ID, PERSON_ID, LAST_NAME, FIRST_NAME)
VALUES (2, 6111, 'ADAMS', 'JOHN');
INSERT INTO TABLE_A (VALUE_ID, PERSON_ID, LAST_NAME, FIRST_NAME)
VALUES (3, 6117, 'ADAMS', 'SAM');
----
INSERT INTO TABLE_B (VALUE_ID, LAST_NAME, FIRST_NAME, ALIAS_ID)
VALUES (4, 'SMITH', 'JOHN', 40856);
INSERT INTO TABLE_B (VALUE_ID, LAST_NAME, FIRST_NAME, ALIAS_ID)
VALUES (5, 'ADAMS', 'JOHN', 3425);
INSERT INTO TABLE_B (VALUE_ID, LAST_NAME, FIRST_NAME, ALIAS_ID)
VALUES (6, 'ADAMS', 'SAM', 40831);
-----
INSERT INTO TABLE_C (VALUE_ID, ALIAS_ID, PERSON_ID)
VALUES (7, 28, 6069);
INSERT INTO TABLE_C (VALUE_ID, ALIAS_ID, PERSON_ID)
VALUES (8, 1022, 6111);
INSERT INTO TABLE_C (VALUE_ID, ALIAS_ID, PERSON_ID)
VALUES (9, 40473, 6117)

我曾尝试使用update语句来完成此操作和/或update语句,但它不起作用。不确定我是否需要if/ELSE语句

最后,表B和表C中的别名_id必须相同。所以,这就是为什么表C将被更新的原因

这就是我目前所拥有的


UPDATE TABLE_C
SET C.ALIAS_ID = (SELECT B.ALIAS_ID 
                FROM TABLE_B B
                JOIN TABLE_A A 
                ON A.FIRST_NAME = B.FIRST_NAME AND A.LAST_NAME = B.LAST_NAME);

您可以使用以下使用
UPDATE的查询。。。从
SQL Server语法:

UPDATE TABLE_C
SET ALIAS_ID = b.ALIAS_ID 
FROM TABLE_C AS c
INNER JOIN TABLE_A AS a ON c.PERSON_ID = a.PERSON_ID
INNER JOIN TABLE_B AS b ON a.FIRST_NAME = b.FIRST_NAME 
                           AND a.LAST_NAME = b.LAST_NAME
这在Oracle中可能适用:

MERGE
INTO TABLE_C
USING (
   SELECT c.PERSON_ID AS pid, b.ALIAS_ID AS bAlias
   FROM TABLE_C AS c
   JOIN TABLE_A AS a ON c.PERSON_ID = a.PERSON_ID
   JOIN TABLE_B AS b ON a.FIRST_NAME = b.FIRST_NAME 
                       AND a.LAST_NAME = b.LAST_NAME       
)
ON (PERSON_ID = pid)
WHEN MATCHED THEN
UPDATE
SET ALIAS_ID = bAlias;

您已经为SQL Server和Oracle SQL Developer标记了此项。您真的在使用Oracle SQL Developer连接到Microsoft SQL Server数据库吗?那么您是在寻找SQL Server语法,而不是相关更新的Oracle语法?我使用的是Oracle SQL developer,并且它连接到microsoft sql server数据库。如果
表B
表a
之间存在匹配,那么应该更新
表C
的哪个特定记录?要更新的记录是别名ID,来自表C和表B这不是记录,而是列<代码>表C有三条记录。什么决定了在找到匹配项后更新这些记录中的哪一个?这是有意义的。我不熟悉内部连接,但我正在研究它。谢谢您的帮助,我将尝试查询。确实,sql命令没有正确结束。我在末尾添加了“;”。@bbetos这取决于sql命令使用的上下文:如果作为单独的命令使用或从SSMS中使用,则不需要分号分隔符。如果我添加分号或没有仍然出错。set语句还需要什么吗?@bbetos我已经根据您在OP中发布的模式/示例数据测试了我的代码,它工作正常。如果您不使用SQL Server作为目标数据库,恐怕我帮不了您。