我在此查询中收到错误“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
)
答案 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吗?
它无法做出决定,并且(正确地)停止并向您提供您之前看到的错误消息。
在更新表格之前,您需要对此进行更彻底的测试。