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