Обновить несколько строк в Oracle - PullRequest
0 голосов
/ 17 июня 2010

Можете ли вы сказать мне, как обновить несколько строк в 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: однострочный подзапрос возвращает более одной строки

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

Подзапрос в вашем утверждении неверен. Вы отключили предложение WHERE или FIRST, и теперь оно возвращает несколько значений, когда это не должно быть.

Вы в основном пытаетесь сказать, что 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

    )

Хотя, если честно, я не совсем уверен, что вы пытаетесь сделать с этим запросом.

0 голосов
/ 17 июня 2010

Я думаю, что вам нужно это:

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 из подзапроса и вместо этого говорит базе данных использовать столбцы из таблицы, которые она обновляет, для фильтрации подзапроса,Как вы уже писали, база данных не имела возможности узнать, как соотнести столбцы из подзапроса с обновляемой таблицей.

...