source

SQL 쿼리에 대한 지원이 필요하고 오류 메시지가 표시됨 하위 쿼리가 하나 이상의 행을 반환함

nicesource 2023. 8. 17. 21:27
반응형

SQL 쿼리에 대한 지원이 필요하고 오류 메시지가 표시됨 하위 쿼리가 하나 이상의 행을 반환함

테이블이 두 개 있는데, 일치하는 voteid를 기반으로 할당(예산)을 검색하여 지출 잔액을 업데이트하고 싶습니다.

나는 phpmyadmin mysql을 사용하고 있습니다.

  • Apache/2.4.43(Win64) OpenSSL/1.1g PHP/7.4.6
  • 데이터베이스 클라이언트 버전: libmysql - mysqlnd 7.4.6
  • PHP 확장: mysqli Documentation curl Documentation mbstring Documentation
  • PHP 버전: 7.4.6
  • 서버 유형:마리아DB

지금까지 저의 SQL 문입니다.

SELECT allocation 
FROM vote 
INNER JOIN expenditure ON vote.voteid = expenditure.voteid 
GROUP BY vote.voteid;

SET @csum = (SELECT allocation 
             FROM vote 
             INNER JOIN expenditure ON vote.voteid = expenditure.voteid 
             GROUP BY vote.voteid);

UPDATE expenditure 
SET balance = (@csum = @csum - expenses) OVER (partition BY voteid ORDER BY expenditureid) AS balance;

오류 메시지:

하위 쿼리가 하나 이상의 행을 반환합니다.

표 1.

| voteid | allocation |
+--------+------------+
| 1      | 50000      |
| 2      | 10000      |
| 3      | 34000      |
| 4      | 70000      |

표 2

    | expenditureid | voteid | expenses |
    +---------------+--------+----------+
    | 1             | 2      | 300      |
    | 2             | 2      | 650      |
    | 3             | 4      | 900      |
    | 4             | 4      | 1200     |
    | 5             | 3      | 34000    |

예상 결과

+---------------+--------+----------+------------------------------+-----------------------------------------------------+
| expenditureid | voteid | expenses | balance (running difference) | calculation (sample column should not be included)  |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+
|               |        |          |                              | 10000                                               |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+
| 1             | 2      | 300      | 9700                         | (10000-300)                                        |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+
| 2             | 2      | 650      | 9050                         | (9700-650)                                          |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+
|               |        |          |                              |                                                     |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+
|               |        |          |                              | 70000                                               |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+
| 3             | 4      | 900      | 69100                        | (70000-900)                                         |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+
| 4             | 4      | 1200     | 67900                        | (69100-1200)                                        |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+
|               |        |          |                              |                                                     |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+
|               |        |          |                              | 34000                                               |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+
| 5             | 3      | 4000     | 30000                        | (34000-4000)                                        |
+---------------+--------+----------+------------------------------+-----------------------------------------------------+

total_allocation은 표시된 내용에 따라 열이 아닙니다.

다음 작업을 수행해야 합니다.

SET @csum = (SELECT sum(vote.allocation) AS total_allocation 
             FROM vote 
             INNER JOIN expenditure ON vote.voteid = expenditure.voteid 
             GROUP BY vote.voteid);

언급URL : https://stackoverflow.com/questions/62464562/need-assistance-with-sql-query-with-error-message-subquery-returns-more-than-1-r

반응형