반응형
Ora-01427 단일 행 하위 쿼리가 두 개 이상의 행을 선택하여 반환하도록 수정하는 방법은 무엇입니까?
다음 쿼리를 실행하면 다음과 같은 메시지가 나타납니다.
"Ora-01427 단일 행 하위 쿼리가 두 개 이상의 행을 반환합니다."
SELECT E.I_EmpID AS EMPID,
E.I_EMPCODE AS EMPCODE,
E.I_EmpName AS EMPNAME,
REPLACE(TO_CHAR(A.I_REQDATE, 'DD-Mon-YYYY'), ' ', '') AS FROMDATE,
REPLACE(TO_CHAR(A.I_ENDDATE, 'DD-Mon-YYYY'), ' ', '') AS TODATE,
TO_CHAR(NOD) AS NOD,
DECODE(A.I_DURATION,
'FD',
'FullDay',
'FN',
'ForeNoon',
'AN',
'AfterNoon') AS DURATION,
L.I_LeaveType AS LEAVETYPE,
REPLACE(TO_CHAR((SELECT C.I_WORKDATE
FROM T_COMPENSATION C
WHERE C.I_COMPENSATEDDATE = A.I_REQDATE
AND C.I_EMPID = A.I_EMPID),
'DD-Mon-YYYY'),
' ',
'') AS WORKDATE,
A.I_REASON AS REASON,
AP.I_REJECTREASON AS REJECTREASON
FROM T_LEAVEAPPLY A
INNER JOIN T_EMPLOYEE_MS E
ON A.I_EMPID = E.I_EmpID
AND UPPER(E.I_IsActive) = 'YES'
AND A.I_STATUS = '1'
INNER JOIN T_LeaveType_MS L
ON A.I_LEAVETYPEID = L.I_LEAVETYPEID
LEFT OUTER JOIN T_APPROVAL AP
ON A.I_REQDATE = AP.I_REQDATE
AND A.I_EMPID = AP.I_EMPID
AND AP.I_APPROVALSTATUS = '1'
WHERE E.I_EMPID <> '22'
ORDER BY A.I_REQDATE DESC
A의 주문 없이 이것을 실행할 때.I_REQDATE DESC는 100개의 행을 반환합니다...
다음 쿼리를 사용합니다.
SELECT E.I_EmpID AS EMPID,
E.I_EMPCODE AS EMPCODE,
E.I_EmpName AS EMPNAME,
REPLACE(TO_CHAR(A.I_REQDATE, 'DD-Mon-YYYY'), ' ', '') AS FROMDATE,
REPLACE(TO_CHAR(A.I_ENDDATE, 'DD-Mon-YYYY'), ' ', '') AS TODATE,
TO_CHAR(NOD) AS NOD,
DECODE(A.I_DURATION,
'FD',
'FullDay',
'FN',
'ForeNoon',
'AN',
'AfterNoon') AS DURATION,
L.I_LeaveType AS LEAVETYPE,
REPLACE(TO_CHAR((SELECT max(C.I_WORKDATE)
FROM T_COMPENSATION C
WHERE C.I_COMPENSATEDDATE = A.I_REQDATE
AND C.I_EMPID = A.I_EMPID),
'DD-Mon-YYYY'),
' ',
'') AS WORKDATE,
A.I_REASON AS REASON,
AP.I_REJECTREASON AS REJECTREASON
FROM T_LEAVEAPPLY A
INNER JOIN T_EMPLOYEE_MS E
ON A.I_EMPID = E.I_EmpID
AND UPPER(E.I_IsActive) = 'YES'
AND A.I_STATUS = '1'
INNER JOIN T_LeaveType_MS L
ON A.I_LEAVETYPEID = L.I_LEAVETYPEID
LEFT OUTER JOIN T_APPROVAL AP
ON A.I_REQDATE = AP.I_REQDATE
AND A.I_EMPID = AP.I_EMPID
AND AP.I_APPROVALSTATUS = '1'
WHERE E.I_EMPID <> '22'
ORDER BY A.I_REQDATE DESC
트릭은 집계 함수를 추가하여 내부 쿼리가 하나의 레코드만 반환하도록 강제하는 것입니다(여기서 max()를 사용했습니다).이는 쿼리에 관한 한 완벽하게 작동하지만, 솔직히 OP는 내부 쿼리가 데이터를 검사하여 여러 개의 레코드를 반환하는 이유를 조사해야 합니다.이러한 다수의 기록이 정말로 비즈니스 측면에서 적합한 것입니까?
하위 쿼리는 이것뿐인 것 같습니다. 추가해 보십시오.ROWNUM
확인할 위치로 제한:
(SELECT C.I_WORKDATE
FROM T_COMPENSATION C
WHERE C.I_COMPENSATEDDATE = A.I_REQDATE AND ROWNUM <= 1
AND C.I_EMPID = A.I_EMPID)
그러나 직원이 한 개 이상의 제품을 가지고 있을 수도 있는 등 이것이 고유하지 않은 이유를 조사해야 합니다.C.I_COMPENSATEDDATE
날짜가 일치하여
성능상의 이유로 룩업 하위 쿼리를 내부/좌측 조인으로 재배열할 수 있는지도 확인해야 합니다.
SELECT
...
REPLACE(TO_CHAR(C.I_WORKDATE, 'DD-Mon-YYYY'),
' ',
'') AS WORKDATE,
...
INNER JOIN T_EMPLOYEE_MS E
...
LEFT OUTER JOIN T_COMPENSATION C
ON C.I_COMPENSATEDDATE = A.I_REQDATE
AND C.I_EMPID = A.I_EMPID
...
(SELECT C.I_WORKDATE
FROM T_COMPENSATION C
WHERE C.I_COMPENSATEDDATE = A.I_REQDATE AND ROWNUM <= 1
AND C.I_EMPID = A.I_EMPID)
언급URL : https://stackoverflow.com/questions/21397694/how-to-fix-ora-01427-single-row-subquery-returns-more-than-one-row-in-select
반응형
'programing' 카테고리의 다른 글
memset과 루프가 복수의 배열을 영점화하는 것 중 어느 것이 더 빠르거나 더 좋습니까? (0) | 2023.11.01 |
---|---|
파워셸에서 병렬로 태스크 실행 (0) | 2023.11.01 |
PowerShell에서 Byte[] 만들기 (0) | 2023.10.27 |
AngularJS - Get 및 Post에 대한 $resource different URL (0) | 2023.10.27 |
AJAX가 뭐지, 정말? (0) | 2023.10.27 |