试图更新表,但我总是得到ora-01427

时间:2019-06-05 18:50:11

标签: oracle sql-update subquery oracle-sqldeveloper

所以我试图用我从其他表获得的一些值更新我的Vorschlagspakete表。确切地讲,我想将3个值写入主表。 Atm看起来像这样:

update vorschlagspakete
set (paketid, verkaufsstelleid) = (
  select k.paketid, k.verkaufsstelleid
  from Konfiguration k, bewertung b
  where k.konfigurationsid = b.konfigurationsid
  group by k.paketid, k.verkaufsstelleid
  having avg(b.sterne) >= 5);

但是每次我尝试这样做都会导致ora-01427。

1 个答案:

答案 0 :(得分:1)

您收到的错误,ORA-01427,表示太多行(由子查询返回)。例如,基于斯科特的模式(因为我没有您的表),它看起来像这样:

SQL> update emp e set
  2    (e.ename, e.job) = (select d.dname, d.loc from dept d);
  (e.ename, e.job) = (select d.dname, d.loc from dept d)
                      *
ERROR at line 2:
ORA-01427: single-row subquery returns more than one row

为什么不起作用?因为子查询返回的不止一行!

SQL> select d.dname, d.loc from dept d;

DNAME          LOC
-------------- -------------
ACCOUNTING     NEW YORK
RESEARCH       DALLAS
SALES          CHICAGO
OPERATIONS     BOSTON

SQL>

那么,如何将所有这些值放入EMP表的一行中?显然,那是行不通的,因此您必须执行某些操作以限制行数。怎么样?这得看情况。

  • 有时DISTINCT会有所帮助,例如

    select distinct d.dname, d.loc from dept d
    
  • 有时还可以使用其他WHERE条件,例如

    select d.dname, d.loc from dept d
    where d.location = 'NEW YORK'
    
  • 有时与要更新的表联接会有所帮助,例如

    select d.dname, d.loc from dept d where d.deptno = e.deptno
    

    这导致

    SQL> update emp e set
      2    (e.ename, e.job) = (select d.dname, d.loc from dept d where d.deptno =       e.deptno);
    
    14 rows updated.
    

您应该怎么做?我不知道,我们没有您的数据。看看上面写的东西是否有帮助。