执行相关更新时缺少表达式

时间:2016-04-05 15:52:31

标签: sql oracle

我正在尝试使用相应表中的匹配名称更新一个表中的名称(如果他们的ID号匹配)。

Required Trait wasn't added to App\Api\V1\Models\User

这是返回的错误:

UPDATE Table1 t1
    SET NAME = SELECT (t2.name 
                            FROM table2 t2
                                WHERE t1.ID = t2.ID);

当与更新分开运行select语句时,它返回SQL Error: ORA-00936: missing expression 不是有效的标识符,即使它作为表中的列存在。

我觉得我匹配PSOUG的语法。

2 个答案:

答案 0 :(得分:2)

左括号需要在select之前,而不是在UPDATE Table1 t1 SET NAME = (SELECT t2.name FROM table2 t2 WHERE t1.ID = t2.ID); 之后:

create table table1 (id number, name varchar2(10));
insert into table1 values (1, null);
insert into table1 values (2, 'Old name');
insert into table1 values (3, null);

create table table2 (id number, name varchar2(10));
insert into table2 values (1, 'New name 1');
insert into table2 values (2, 'New name 2');

整个子查询位于括号内。您链接到的PSOUG页面在其第三个示例中显示的是“基于单个查询值的更新”;以及the examples in the documentation显示的内容。

快速演示,简单的表格设置:

Error report -
SQL Error: ORA-00936: missing expression
00936. 00000 -  "missing expression"

问题的原始代码获得:

UPDATE Table1 t1
SET NAME = (SELECT t2.name 
                        FROM table2 t2
                            WHERE t1.ID = t2.ID);

3 rows updated.

select * from table1;

        ID NAME     
---------- ----------
         1 New name 1
         2 New name 2
         3           

上面的代码有效:

table1

从评论中您可能认为您可能需要在子查询中另外引用UPDATE Table1 t1 SET NAME = ( SELECT t2.name FROM table1 t1 JOIN table2 t2 ON t1.ID = t2.ID); Error report - SQL Error: ORA-01427: single-row subquery returns more than one row 01427. 00000 - "single-row subquery returns more than one row" ,但如果这样做,则会丢失更新与子查询行之间的关联,即使表正在更新还有一个别名:

table1

如果代码不正确,则子查询中的t1table1别名与外t1子句中的update ...OpenCL无关。 / p>

答案 1 :(得分:0)

只有在table2中,每个id都有一个唯一的名称,这样才能正常工作。

UPDATE Table1 t1
SET NAME = (SELECT t2.name 
                    FROM table2 t2
                        WHERE t1.ID = t2.ID);

例:
在以下情况下返回查询。如果table2具有类似

的值
  name id
  x    1
  y    1