【问题标题】:Trying to update table but i always get ora-01427试图更新表,但我总是得到 ora-01427
【发布时间】:2019-06-05 18:50:11
【问题描述】:

所以我试图用我从其他表中获得的一些值来更新我的 Vorschlagspakete 表。确切地说,我想将 3 个值写入主表。自动取款机看起来是这样的:

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。

【问题讨论】:

    标签: oracle sql-update subquery oracle-sqldeveloper


    【解决方案1】:

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

    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.
      

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多