문제
ORDER BY에서 ORA-00907: 누락된 우괄호라는 에러가 발생!!
검색 결과 아래와 같은 글을 찾았습니다.
서브쿼리에서는 ORDER BY 를 사용하지 못한다. ORDER BY는 SELECT 절에서 오직 한 개만 올 수 있기 때문에 메인쿼리 마지막 문장에 위치해야 한다.
그런데 LIMIT 1과 함께 사용해도 여전히 에러가 발생했습니다.
수정 방법
예시)
- 테이블 생성
-- Table: Students
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
StudentName VARCHAR(50)
);
-- Table: Grades
CREATE TABLE Grades (
GradeID INT PRIMARY KEY,
StudentID INT,
ExamDate DATE,
Score INT,
FOREIGN KEY (StudentID) REFERENCES Students(StudentID)
);
- ORDER BY 사용
-- This query will raise an error!
SELECT
StudentID,
StudentName,
(SELECT Score
FROM Grades
WHERE StudentID = Students.StudentID
ORDER BY ExamDate DESC
LIMIT 1) AS HighestScore
FROM Students;
1. MAX를 사용
테이블 내 한개의 컬럼에 대한 최소값, 최댓값을 구해야 할 경우 ORDER BY ... LIMIT 1 대신 MAX를 사용할 수 있습니다.
-- This query works without 'ORDER BY' in the subquery
SELECT
StudentID,
StudentName,
(SELECT MAX(Score) --For when the same 'ExamDate' exists
FROM Grades
WHERE StudentID = Students.StudentID
AND ExamDate = (SELECT MAX(ExamDate) FROM Grades WHERE StudentID = Students.StudentID)
) AS HighestScore
FROM Students;
2. ORDER BY를 메인쿼리로 이동
구하고자 하는 결과값이 하나인 경우에는 ORDER BY ... LIMIT 1을 메인쿼리로 이동할 수 있습니다.
SELECT
S.StudentID,
S.StudentName,
G.Score AS HighestScore
FROM Students S
JOIN Grades G ON G.StudentID = S.StudentID
WHERE S.StudentID IN (1, 2, 3)
ORDER BY G.ExamDate DESC
LIMIT 1;
'SQL > RDBMS' 카테고리의 다른 글
[MariaDB] 외래키 생성/삭제 방법 (0) | 2024.11.30 |
---|---|
쿼리 실행 속도 확인 (0) | 2024.05.30 |
[MariaDB] RECURSIVE 계층 메뉴 구성 (0) | 2023.08.14 |
[MariaDB] 중복 파일명 처리(이름 뒤에 seq 붙이기) (0) | 2023.07.03 |
[MariaDB] 환경 구축 (생성, 삭제, 권한, 백업) (0) | 2023.04.25 |