0

エラー メッセージが表示されるのはなぜですか?

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')
4

2 に答える 2

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')
于 2013-04-10T16:02:20.113 に答える
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 テーブルに同じエイリアスを使用したことはわかっています。しかし、JOB_TASK テーブルをクエリに再結合したため、Oracle に関する限り、これは単なる偶然です。このクエリは基本的に、すべての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 を取得できます。

于 2013-04-10T16:00:56.170 に答える