sql - 尝试开发语法以基于第三个表的联接使用另一个表中的值更新一个表

标签 sql oracle oracle11g

下面的测试用例显示了表的构造。我需要根据 tab_2_3 上的联接更新 tab_1 中的地址数据。显示的更新脚本返回“缺少右括号”,我确信它指出语法中的错误。对于获得正确更新基表的语句的任何帮助或指导,我们将不胜感激。

create table tab_1(address varchar2(25), city varchar2(25), state varchar2(2),zip varchar2(10), office_id varchar2(25));

create table tab_2 (company varchar2(25), office varchar2(25), address_id varchar2(5), office_id varchar2(5));

create table tab_3 (address_id varchar2(5), address varchar2(25), city varchar2(25), state varchar2(2),zip varchar2(10));


insert into tab_1(office_id) values(46);

insert into tab_2(company, office, address_id, office_id) 
    values('Stone', 'north', '45', '15');
insert into tab_3(address_id, address, city, state, zip) 
    values('15', '12Main', 'York', 'NY', '12345');


ALTER TABLE TAB_1 ADD 
CONSTRAINT tab_1_PK
 PRIMARY KEY (OFFICE_ID)
 ENABLE
 VALIDATE;

 ALTER TABLE TAB_2 ADD 
CONSTRAINT tab_2_PK
 PRIMARY KEY (OFFICE_ID)
 ENABLE
 VALIDATE;

ALTER TABLE TAB_3 ADD 
CONSTRAINT tab_3_PK
 PRIMARY KEY (ADDRESS_ID)
 ENABLE
 VALIDATE;




update (select tab_3.address, tab_3.city, tab_3.state, tab_3.zip, tab_1.address,     tab_1.city, tab_1.state, tab_1.zip
        FROM
    INNER JOIN tab_1 ON (tab_1.office_id=tab_2.office.id) 
    INNER JOIN tab_3 ON (tab_2.address_id = tab_3.address_id))
        SET tab_1.address=tab_3.address, tab_1.city=tab_3.city, tab_1.state=tab_3.state, tab_1.zip=tab_3.zip;


UPDATE ( SELECT src.x src_x, src.y src_y , tgt.x tgt_x, tgt.y tgt_y FROM src 
INNER JOIN tgt ON ( src.id = tgt.id ) ) SET tgt_x = src_x , tgt_y = src_y

*******************************************************

UPDATE tab_1
   SET (address,
        city,
        state,
        zip) =
          (SELECT (address, city, state, zip)
             FROM tab_3, tab2
            WHERE     tab_1.office_id = tab_2.office_id
                  AND tab_2.address_id = tab_3.address_id);

最佳答案

您的前两个 update 语句不完整 - 它们甚至没有指定要更新哪个表。它们离我太远了,我担心我会忽略它们,因为我不知道它们是如何挽救的*8-)

第三个是一组额外的括号;您在子查询中选择的列列表中不需要它们(并且它们无效),它试图将其解释为不存在的进一步子查询。您的表名之一也有拼写错误:

UPDATE tab_1
   SET (address, city, state, zip) =
       (SELECT address, city, state, zip
          FROM tab_3, tab_2
         WHERE tab_1.office_id = tab_2.office_id
           AND tab_2.address_id = tab_3.address_id);

我建议您使用现代 join 语法,特别是如果这是相当新的并且您还没有学到(可以说)坏习惯:

UPDATE tab_1
   SET (address, city, state, zip) =
       (SELECT address, city, state, zip
          FROM tab_2
          JOIN tab_3
            ON tab_3.address_id = tab_2.address_id
         WHERE tab_2.office_id = tab_1.office_id);

关于sql - 尝试开发语法以基于第三个表的联接使用另一个表中的值更新一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15256470/

相关文章:

oracle - 未启用延迟的分割创建功能(ORA-00439)

sql - Oracle:在存储过程中使用数据库链接:表或 View 不存在

java - Solr查询转SQL查询

sql - 将 mssql openjson 数组类型值结果转换为表?

Oracle 软件包规范和正文

Oracle - 删除子行

oracle - ORA-12514 TNS :listener does not currently know of service requested in connect descriptor

mysql - 如何在 SQL 中获取数据库中 2 行之间的列差异

regex - 使用 oracle 正则表达式删除前缀和后缀

oracle - 勺子 : import data from Oracle