Coding/SQL
[LeetCode-SQL 50] 626. Exchange Seats
kangplay
2025. 2. 25. 18:08
문제
https://leetcode.com/problems/exchange-seats/?envType=study-plan-v2&envId=top-sql-50

설명
id가 짝수이면 id-1 을 하고, id가 홀수이면, id+1을 하고, 테이블 데이터 수가 홀수이고 id가 그 수와 같으면 id를 변경하지 않는 sql문을 작성하면 된다. 처음에는 단순한 조건문으로 작성하면 된다고 생각했는데, 오류가 났다.
select
case when id = count(*) then id = id
when id%2 = 0 then id = id-1
when id%2 <> 0 then id = id+1 end as id ,
student
from Seat
order by id
- 먼저, when 절에는 데이터 수정문이 들어가면 안된다. 즉, id = id-1와 같이 행의 정보를 수정하는 것이 아닌, id-1와 같이 부여해주어야 한다.
- 집계함수(count(*))를 case문 내에서 직접 못 쓴다. 행마다 계산되는 case문과 다르게 집계함수는 전체 테이블을 한 번 훑은 후 결과를 반환하기 때문이다.
- SQL에서 서브쿼리의 결과는 다음 두 가지로 구분된다.
- 스칼라 서브쿼리: 단 한 개의 값을 반환 -> 숫자값인 것처럼 인식하여 바로 비교 가능!
- 테이블 서브쿼리: 하나 이상의 행과 하나 이상의 열을 반환 -> in 과 같은 조건 등으로 처리해야함!
구현
select
case when (select count(*) from Seat) %2 <> 0
and id = (select count(*) from Seat) then id
when id%2 = 0 then id-1
when id%2 <> 0 then id+1 end as id ,
student
from Seat
order by id