在下面的查询中获取“SQL错误:ORA-01427:单行子查询返回多行”

时间:2017-11-09 04:30:31

标签: oracle

我在此查询中收到错误“SQL错误:ORA-01427:单行子查询返回多行”

UPDATE IN_DOC_HDR INDOC
SET INDOC.DOC_CLSD_DT = (
  SELECT PRHDR.DOC_CLSD_DT
  FROM PR_DOC_HDR PRHDR
   , PR_DOC_COMM PRCOMM
  WHERE INDOC.DOC_ACTU_AM <> 0 
      AND INDOC.DOC_ACTU_AM <> INDOC.DOC_CLSD_AM 
      AND PRCOMM.IN_DOC_CD = INDOC.DOC_CD 
      AND PRCOMM.IN_DOC_DEPT_CD = INDOC.DOC_DEPT_CD 
      AND PRCOMM.IN_DOC_ID = INDOC.DOC_ID 
      AND PRCOMM.DOC_PHASE_CD = 3 
      AND PRHDR.DOC_CD = PRCOMM.DOC_CD 
      AND PRHDR.DOC_DEPT_CD = PRCOMM.DOC_DEPT_CD 
      AND PRHDR.DOC_ID = PRCOMM.DOC_ID
  )
WHERE EXISTS (
  SELECT 1
  FROM IN_DOC_HDR INDOC
   , PR_DOC_COMM PRCOMM
   , PR_DOC_HDR PRHDR
  WHERE INDOC.DOC_ACTU_AM <> INDOC.DOC_CLSD_AM 
      AND INDOC.DOC_ACTU_AM <> 0 
      AND PRCOMM.IN_DOC_CD = INDOC.DOC_CD 
      AND PRCOMM.IN_DOC_DEPT_CD = INDOC.DOC_DEPT_CD 
      AND PRCOMM.IN_DOC_ID = INDOC.DOC_ID 
      AND PRCOMM.DOC_PHASE_CD = 3 
      AND PRHDR.DOC_CD = PRCOMM.DOC_CD 
      AND PRHDR.DOC_DEPT_CD = PRCOMM.DOC_DEPT_CD 
      AND PRHDR.DOC_ID = PRCOMM.DOC_ID
  )

2 个答案:

答案 0 :(得分:0)

对于此错误,您应该使用ROWNUM将数据限制为1行。真的可以这样做。

UPDATE IN_DOC_HDR INDOC SET INDOC.DOC_CLSD_DT = (SELECT PRHDR.DOC_CLSD_DT from PR_DOC_HDR PRHDR ,PR_DOC_COMM PRCOMM WHERE 
INDOC.DOC_ACTU_AM <>0
AND INDOC.DOC_ACTU_AM <> INDOC.DOC_CLSD_AM AND PRCOMM.IN_DOC_CD=INDOC.DOC_CD AND PRCOMM.IN_DOC_DEPT_CD=INDOC.DOC_DEPT_CD AND
PRCOMM.IN_DOC_ID = INDOC.DOC_ID AND PRCOMM.DOC_PHASE_CD = 3 AND PRHDR.DOC_CD = PRCOMM.DOC_CD AND PRHDR.DOC_DEPT_CD = PRCOMM.DOC_DEPT_CD
AND PRHDR.DOC_ID=PRCOMM.DOC_ID WHERE ROWNUM <= 1) WHERE EXISTS 
(SELECT 1 FROM IN_DOC_HDR INDOC,PR_DOC_COMM PRCOMM,PR_DOC_HDR PRHDR WHERE INDOC.DOC_ACTU_AM <> INDOC.DOC_CLSD_AM AND 
INDOC.DOC_ACTU_AM <>0 AND PRCOMM.IN_DOC_CD=INDOC.DOC_CD AND PRCOMM.IN_DOC_DEPT_CD=INDOC.DOC_DEPT_CD AND
PRCOMM.IN_DOC_ID = INDOC.DOC_ID AND PRCOMM.DOC_PHASE_CD = 3 AND PRHDR.DOC_CD = PRCOMM.DOC_CD AND PRHDR.DOC_DEPT_CD = PRCOMM.DOC_DEPT_CD
AND PRHDR.DOC_ID=PRCOMM.DOC_ID)

答案 1 :(得分:0)

这可以返回多少行? =多个

  SELECT PRHDR.DOC_CLSD_DT
  FROM PR_DOC_HDR PRHDR
   , PR_DOC_COMM PRCOMM
  WHERE INDOC.DOC_ACTU_AM <> 0 
      AND INDOC.DOC_ACTU_AM <> INDOC.DOC_CLSD_AM 
      AND PRCOMM.IN_DOC_CD = INDOC.DOC_CD 
      AND PRCOMM.IN_DOC_DEPT_CD = INDOC.DOC_DEPT_CD 
      AND PRCOMM.IN_DOC_ID = INDOC.DOC_ID 
      AND PRCOMM.DOC_PHASE_CD = 3 
      AND PRHDR.DOC_CD = PRCOMM.DOC_CD 
      AND PRHDR.DOC_DEPT_CD = PRCOMM.DOC_DEPT_CD 
      AND PRHDR.DOC_ID = PRCOMM.DOC_ID

现在考虑在UPDATE中使用它,它“逐行”

在单行上,INDOC.DOC_CLSD_DT只能存储单个值

那么,如果查询可以返回多个值,它会选择将哪个值放入INDOC.DOC_CLSD_DT吗?

它无法做出决定,并且(正确地)停止并向您提供您之前看到的错误消息。

在更新表格之前,您需要对此进行更彻底的测试。