2013-04-10 68 views
0

为什么我会收到错误消息?为什么我收到错误ORA-01427:单行子查询返回多行

ORA-01427:单行子查询返回不止一行与此查询

UPDATE JOB_TASK JT1 
    SET JT1.job_task_status_id = 
      (SELECT JTS1.JOB_TASK_STATUS_ID 
      FROM MAXIMO_WO MW1 
        INNER JOIN job_task_status jts1 
        ON MW1.STATUS = jts1.description 
        INNER JOIN JOB_TASK JT1 
        ON jt1.job_task_id = mw1.wonum) 
WHERE JT1.JOB_TASK_STATUS_ID IN 
      (SELECT JTS.JOB_TASK_STATUS_ID 
      FROM JOB_TASK_STATUS JTS, 
        JOB_TASK JT, 
        MAXIMO_WO MW, 
        WORK_ORDER_CONTROL WOC 
      WHERE  JT.JOB_TASK_ID = MW.WONUM 
        AND JT.JOB_TASK_STATUS_ID = JTS.JOB_TASK_STATUS_ID 
        AND JT.WORK_ORDER_ID = WOC.WORK_ORDER_ID 
        and jt.job_task_id = mw.wonum 
        AND MW.STATUS IN 
         ('APPR', 
          'SCHED', 
          'INPRG', 
          'FNACCEPT', 
          'WMATL', 
          'WKCOMP', 
          'COMP') 
        AND WOC.COMPANY_ID = '21' 
        AND MW.SITEID <> 'NUCDEV' 
        AND DECODE (
         INSTR (JTS.DESCRIPTION, '-', 1), 
         0, JTS.DESCRIPTION, 
         SUBSTR (JTS.DESCRIPTION, 
           1, 
           (INSTR (JTS.DESCRIPTION, '-', 1) - 1))) <> 
         MW.STATUS 
        AND JT.LEVEL_NUMBER = '3' 
        AND MW.STATUSDATE < SYSDATE - 1 
        AND MW.WONUM <> 'UNDEFINED') 
+5

因为你的子查询返回多个行。 – swasheck 2013-04-10 15:55:51

+0

如果你从'SET'运行'SELECT',你会返回多少行? – Taryn 2013-04-10 15:56:48

+0

@swasheck你能为此展示一些证据吗? – Kermit 2013-04-10 15:58:02

回答

0

正如错误表示,在SET语句中的子查询返回多个值:

SELECT JTS1.JOB_TASK_STATUS_ID 
      FROM MAXIMO_WO MW1 
        INNER JOIN job_task_status jts1 
        ON MW1.STATUS = jts1.description 
        INNER JOIN JOB_TASK JT1 
        ON jt1.job_task_id = mw1.wonum 

因为这个查询没有连接到你的外部UPDATE语句。我知道,我知道,您为JOB_TASK表使用了相同的别名!但就Oracle而言,这只是一个巧合,因为您已将JOB_TASK表重新加入到查询中。该查询将基本上每返回,job_task,其工单数据及其任务状态。

你需要的仅仅是引用您的外线别名:

UPDATE JOB_TASK JT1 
    SET JT1.job_task_status_id = 
      (SELECT JTS1.JOB_TASK_STATUS_ID 
      FROM MAXIMO_WO MW1 
        INNER JOIN job_task_status jts1 
        ON MW1.STATUS = jts1.description 
        and MW1.MoNum = jt1.job_task_id) 
... 

这会正确使用你的外JOB_TASK的job_task_id以获取其task_status_id。

2

我怀疑你真的想要声明的SET部分中的子选择。尝试这样的:

UPDATE JT1 
    SET JT1.job_task_status_id = JTS1.JOB_TASK_STATUS_ID 
FROM MAXIMO_WO MW1 
     INNER JOIN job_task_status jts1 
      ON MW1.STATUS = jts1.description 
     INNER JOIN JOB_TASK JT1 
      ON jt1.job_task_id = mw1.wonum 
WHERE JT1.JOB_TASK_STATUS_ID IN 
     (SELECT JTS.JOB_TASK_STATUS_ID 
     FROM JOB_TASK_STATUS JTS, 
       JOB_TASK JT, 
       MAXIMO_WO MW, 
       WORK_ORDER_CONTROL WOC 
     WHERE  JT.JOB_TASK_ID = MW.WONUM 
       AND JT.JOB_TASK_STATUS_ID = JTS.JOB_TASK_STATUS_ID 
       AND JT.WORK_ORDER_ID = WOC.WORK_ORDER_ID 
       and jt.job_task_id = mw.wonum 
       AND MW.STATUS IN 
        ('APPR', 
         'SCHED', 
         'INPRG', 
         'FNACCEPT', 
         'WMATL', 
         'WKCOMP', 
         'COMP') 
       AND WOC.COMPANY_ID = '21' 
       AND MW.SITEID <> 'NUCDEV' 
       AND DECODE (
        INSTR (JTS.DESCRIPTION, '-', 1), 
        0, JTS.DESCRIPTION, 
        SUBSTR (JTS.DESCRIPTION, 
          1, 
          (INSTR (JTS.DESCRIPTION, '-', 1) - 1))) <> 
        MW.STATUS 
       AND JT.LEVEL_NUMBER = '3' 
       AND MW.STATUSDATE < SYSDATE - 1 
       AND MW.WONUM <> 'UNDEFINED') 
相关问题