"서브쿼리가 두 개 이상의 행을 반환함" 오류 해결 방법
여러 행을 반환하는 쿼리와 여러 행의 값 중 하나로 기준을 설정하는 쿼리가 있습니다.기본적으로 서브쿼리는 다음과 같습니다.
select *
from table
where id= (multiple row query);
서 ★★★★★multiple row query
여러 행을 반환합니다.따라서 이러한 행의 값이 1, 2, 3일 경우 id를 1, 2, 3으로 설정합니다.
=
는 서브쿼리가 1개의 값만 반환할 때 사용할 수 있습니다.
값을 하는 경우, 이을 반환하다를 .IN
:
select *
from table
where id IN (multiple row query);
예를 들어 다음과 같습니다.
SELECT *
FROM Students
WHERE Marks = (SELECT MAX(Marks) FROM Students) --Subquery returns only 1 value
SELECT *
FROM Students
WHERE Marks IN
(SELECT Marks
FROM Students
ORDER BY Marks DESC
LIMIT 10) --Subquery returns 10 values
하시면 됩니다.in()
:
select *
from table
where id in (multiple row query)
또는 조인을 사용합니다.
select distinct t.*
from source_of_id_table s
join table t on t.id = s.t_id
where <conditions for source_of_id_table>
가입은 성능 면에서 가장 나쁜 선택이며, 정확한 상황과 사용 중인 데이터베이스에 따라 훨씬 더 나은 성능을 제공할 수 있습니다.
MAX
안에서SELECT
반환하기 ... ... 예
INSERT INTO school_year_studentid (student_id,syr_id) VALUES
((SELECT MAX(student_id) FROM student), (SELECT MAX(syr_id) FROM school_year))
대신
INSERT INTO school_year_studentid (student_id,syr_id) VALUES
((SELECT (student_id) FROM student), (SELECT (syr_id) FROM school_year))
MAX를 사용하지 않고 시도하면 둘 이상의 값이 반환됩니다.
'서브 쿼리가 1개 이상의 행을 반환한다'라는 오류가 표시되면 데이터베이스는 실제로 확인할 수 없는 순환 참조가 있음을 알려 줍니다.스프레드시트를 사용하여 셀 A1 = B1이라고 말한 다음 B1 = A1이라고 말하는 것과 비슷합니다.이 오류는 일반적으로 이중 중첩된 서브 쿼리가 필요한 시나리오와 관련되어 있습니다.이 문제를 해결하기 위해 일반적으로 필요한 유형의 쿼리인 '크로스 탭 쿼리'를 찾아보는 것이 좋습니다.기본적으로 서브쿼리 내에 네스트된 외부 결합(왼쪽 또는 오른쪽)이거나 그 반대입니다.또한 다음과 같은 이중 결합(크로스 탭 쿼리의 한 종류로도 간주됨)을 사용하여 이 문제를 해결할 수 있습니다.
CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_GET_VEHICLES_IN`(
IN P_email VARCHAR(150),
IN P_credentials VARCHAR(150)
)
BEGIN
DECLARE V_user_id INT(11);
SET V_user_id = (SELECT user_id FROM users WHERE email = P_email AND credentials = P_credentials LIMIT 1);
SELECT vehicles_in.vehicle_id, vehicles_in.make_id, vehicles_in.model_id, vehicles_in.model_year,
vehicles_in.registration, vehicles_in.date_taken, make.make_label, model.model_label
FROM make
LEFT OUTER JOIN vehicles_in ON vehicles_in.make_id = make.make_id
LEFT OUTER JOIN model ON model.make_id = make.make_id AND vehicles_in.model_id = model.model_id
WHERE vehicles_in.user_id = V_user_id;
END
위의 코드에서는 SELECT 구간에 3개의 테이블이 있으며 이들 3개의 테이블은 FROM 구와 LEFT OUTER JOIN 구 뒤에 2개의 LEFT OUTER JOIN 구간에 구문적으로 정확하게 나타나도록 해야 합니다.
특히 정기적인 보고서 쿼리를 작성할 때 매우 중요한 구성이며 복잡한 상호 참조에 가장 중요한 기술일 수 있으므로 모든 개발자는 이러한 구성(크로스 탭 및 더블 조인)을 검토해야 합니다.
또 하나 경고해야 할 것은 다음과 같습니다.정기적인 보고서뿐만 아니라 가동 중인 시스템의 일부로 크로스탭을 사용하는 경우 최소 레코드가 반환될 때까지 레코드 카운트를 체크하고 가입 조건을 재설정해야 합니다.그렇지 않으면 큰 테이블과 크로스탭이 서버를 정지시킬 수 있습니다.이게 도움이 됐으면 좋겠다.
답변 추가: 서브쿼리할 테이블에서 여러 열을 선택할 수 있다는 아이디어를 자세히 설명하고 있습니다.
여기에 가장 최근에 주조된 요람과 관련 정보가 필요했습니다.
저는 처음에 투표, 아이템 ID, 사용자 ID 등과 함께 max(투표)를 선택하려고 했지만 쿼리는 max 투표수를 반환하지만 다른 정보에 대해서는 랜덤 행도 반환됩니다.1과 0의 무리에서는 잘 보이지 않는다.
이 방법은 잘 작동했습니다.
$query = "
SELECT t1.itemid, t1.itemtext, t2.vote, t2.votedate, t2.userid
FROM
(
SELECT itemid, itemtext FROM oc_item ) t1
LEFT JOIN
(
SELECT vote, votedate, itemid,userid FROM oc_votes
WHERE votedate IN
(select max(votedate) FROM oc_votes group by itemid)
AND userid=:userid) t2
ON (t1.itemid = t2.itemid)
order by itemid ASC
";
WHERE 절 WHERE의 서브쿼리(항목 ID별로 max(voted) FROM oc_votes group 선택)는 최대 투표일이 있는 레코드 1개를 반환합니다.
언급URL : https://stackoverflow.com/questions/28171474/solution-to-subquery-returns-more-than-1-row-error
'source' 카테고리의 다른 글
클래스 JSON을 시리얼화 하는 방법 (0) | 2022.12.25 |
---|---|
읽기 전용 목록 또는 수정 가능한 목록을 읽습니다.Net4.0 (0) | 2022.12.25 |
webpack-dev-server에 원격으로 연결하면 "Invalid Host header" 메시지가 나타난다. (0) | 2022.12.25 |
Python에서 동적(파라미터화) 단위 테스트를 생성하는 방법은 무엇입니까? (0) | 2022.12.25 |
MariaDB 10.2가 Percona XtraDB 대신 InnoDB를 다시 사용하는 이유는 무엇입니까? (0) | 2022.12.25 |