SQL/RDBMS

서브 쿼리 ORDER BY

dddzr 2023. 10. 23. 11:22

문제

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;