【问题标题】:Update multiple rows in oracle更新oracle中的多行
【发布时间】:2010-06-17 07:21:14
【问题描述】:

你能告诉我如何更新 oracle 中的多行,因为当我触发更新语句时它给了我以下错误

UPDATE  BI_BSELATEST_LATESTPRICESTEST
SET PREVIOUS_DAY_CLOSE =
    (SELECT  DISTINCT aa.DLYPRICE_CLOSE 
     FROM  DATAFEED_EQTY.FEED_DLYPRICE aa  ,
           (
           SELECT  a.sc_code ,  MAX(a.DLYPRICE_DATE) as max_date
           from    DATAFEED_EQTY.FEED_DLYPRICE a,BI_BSELATEST_LATESTPRICES b
           where   a.SC_CODE = b.SC_CODE
           and    a.ST_EXCHNG = 'BSE'
           and    a.DLYPRICE_DATE <   b.upd_time 
           group by a.sc_code
         ) bb
    WHERE  aa.SC_CODE =  bb.sc_code
    and    aa.DLYPRICE_DATE = max_date)

ORA-01427: 单行子查询返回多于一行

提前致谢

【问题讨论】:

  • 您之前获得的任何个问题的答案都不足以接受(您通过单击左侧的复选标记接受答案)?
  • 感谢您发布一些代码。您还可以通过将每行缩进4个空格来正确格式化代码(或突出显示并单击工具栏上的“代码”按钮)

标签: sql oracle ora-01427


【解决方案1】:

您的语句中的子查询是错误的。您离开了 WHEREFIRST 子句,现在它在不应该返回多个值时返回。

您基本上是想说PREVIOUS_DAY_CLOSE 应该同时是多个值。我猜你在你的子选择上留下了一个WHERE 子句,它将那个子查询的结果链接到你试图更新的特定行。类似的东西(注意粗体线):

UPDATE  BI_BSELATEST_LATESTPRICESTEST
SET PREVIOUS_DAY_CLOSE =
    (SELECT  DISTINCT aa.DLYPRICE_CLOSE 
     FROM  DATAFEED_EQTY.FEED_DLYPRICE aa  ,
           (
           SELECT  a.sc_code ,  MAX(a.DLYPRICE_DATE) as max_date
           from    DATAFEED_EQTY.FEED_DLYPRICE a,BI_BSELATEST_LATESTPRICES b
           where   a.SC_CODE = b.SC_CODE
           and    a.ST_EXCHNG = 'BSE'
           and    a.DLYPRICE_DATE <   b.upd_time 
           group by a.sc_code
         ) bb
    WHERE  aa.SC_CODE =  bb.sc_code
    and    aa.DLYPRICE_DATE = max_date

   AND bb.sc_code = BI_BSELATEST_LATESTPRICESTEST.sc_code

    )

不过,说实话,我不太确定你想用这个查询做什么。

【讨论】:

  • 我想用我在 select 语句中得到的值更新 BI_BSELATEST_LATESTPRICESTEST 表中 PREVIOUS_DAY_CLOSE 字段中的记录,希望这些信息对您有所帮助..
  • @devang - 对,所以对于BI_BSELATEST_LATESTPRICESTEST 的某个给定行,您想要从选择语句中获得的哪个 值。在任何给定时间,一行中的一列只能有一个值,对吧?
  • 是的,我只得到一列的值..但它仍然给我同样的错误 ORA-01427: 单行子查询返回多于一行。
  • @devang - 我认为你不太了解。取出您的子选择并尝试自己运行它,看看会得到什么结果s,因为您肯定会得到不止一行。
  • @lc- 我尝试运行 select 和 sub select 查询,它现在给了我大约 1000 行你能告诉我如何更新 BI_BSELATEST_LATESTPRICESTEST 表中 PREVIOUS_DAY_CLOSE 列中的这些行。
【解决方案2】:

我想你想要的是这样的:

UPDATE  BI_BSELATEST_LATESTPRICESTEST b
SET PREVIOUS_DAY_CLOSE =
    (SELECT  DISTINCT aa.DLYPRICE_CLOSE 
     FROM  DATAFEED_EQTY.FEED_DLYPRICE aa  ,
           (
           SELECT  a.sc_code ,  MAX(a.DLYPRICE_DATE) as max_date
           from    DATAFEED_EQTY.FEED_DLYPRICE a
           where   a.SC_CODE = b.SC_CODE
           and    a.ST_EXCHNG = 'BSE'
           and    a.DLYPRICE_DATE <   b.upd_time 
           group by a.sc_code
         ) bb
    WHERE  aa.SC_CODE =  bb.sc_code
    and    aa.DLYPRICE_DATE = max_date)

这会从子查询中删除 BI_BSELATEST_LATESTPRICESTEST,而是告诉数据库使用正在更新的表中的列来过滤子查询。正如您所写,数据库无法知道如何将子查询中的列与正在更新的表关联起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2016-06-06
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多