예를들면 emp테이블의 100개의 데이터중에서 9번째 데이터의 age 를 19로 변경하고자 합니다.
아래 두 줄의 쿼리를 서브쿼리로 한 줄로 만들수 있을까요?
select * from emp limit 9,1
update emp set age = 19
MSSQL 은 limit을 지원 안하는걸로 알고 있습니다.
emp 테이블에 primary key가 있다면
primary key를 A라 하겠습니다.
update emp set age = 19 where A = (select A FROM emp OFFSET 8 ROWS FETCH NEXT 1 ROWS ONLY)
이런식으로 작성하면 되지 않을까 생각됩니다..
답변감사합니다.
한가지 문제라면 해당 테이블에는 Primary Key가 없습니다.
그리고 각 필드데이터는 중복이 있을 수 있어서 WHERE 조건에도 제약이 있습니다. 그래서 SELECT 에서 UPDATE 할 특정 데이터를 하나만 찾아야 하므로 LIMIT 9, 1 이나 OFFSET ~ 구문을 필요로 합니다.
신입 DBA 라 방법이 잘 떠오르지 않지만..
한 쿼리로 해결 해야 되는 부분이 아니라면
emp 테이블을 임시테이블이나 테이블 변수에 Identity 변수를 두어 복사를 한다음
identity 값이 9 번째 인것을 업데이트 하면 되지 않을까 생각되네요..
서브쿼리로 작성은 Primary Key가 없으면 힘들지 않을까요 ..? ㅜㅜ
도움 못드려 죄송합니다..
https://docs.microsoft.com/ko-kr/sql/t-sql/queries/select-order-by-clause-transact-sql
를 보시면
"ORDER BY 절을 지정하지 않으면 결과 집합에서 행이 반환되는 순서가 보장되지 않습니다."
라고 나와있습니다.
따라서 조건에 맞는 아무 행이나 1개 행을 update하신 후에 왜 이렇게 됐느냐고 누군가가 물어본다면 "접때 업데이트 할때는 그게 9번째 행이었다"라고 우기면 됩니다.
--예제: 입력한 순서대로 안 보여주는 예제
정렬기준이 명확하고 그 순서에 따라 9번째 행이 1개의 행 밖에 없다면
참.. 그래서 진짜 하고 싶었던 얘기를 못 썼네요..
PK 만드세요.
두 분의 좋은 답변과 지적에 감사드립니다.
Key가 없기 때문에 서브쿼리로 해당열을 찾을수는 없습니다.
위에 답변주신 분들 말씀대로 Key를 생성하시거나
아니면 커서를 이용해서 Row별로 Update를 하는 방법이 있습니다.
SELECT 쿼리를 커서로 만드시고,
커서를 돌리면서 카운팅해서,
9번째 데이터를 UPDATE 하면 됩니다.
아래 링크에 커서를 이용한 UPDATE 예제가 있습니다.
조금 응용하면 됩니다.
https://technet.microsoft.com/en-us/library/ms188713(v=sql.105).aspx