database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 6909 게시물 읽기
No. 6909
업데이트 쿼리문 질문입니다.
작성자
코우지(daum6201)
작성일
2015-05-12 11:19
조회수
5,231

안녕하세요

 

업데이트를 해야 하는 테이블이 하나 있구요.

이 테이블은 tb_A 라고 가정하구요

 

다른 한 테이블은 값을 가지고 있는 테이블입니다.

이 테이블을 tb_B 라고 가정하겠습니다.

 

tb_A 는 (int)Level, (int) Money, (datetime) RecvTime 이렇게 컬럼이 있습니다

레벨에 따라 흘러간 시간 만큼 돈이 쌓이는 겁니다.

그런데 문제는 쌓이는 돈에 제한이 걸려 있습니다.

 

tb_B에는 레벨마다 시간당 쌓이는 돈의 수치와 제한된 수치를 가지고 있습니다.

(int) Level --레벨

(int) Money --시간당 쌓이는 액수

(int) MaxMoney --제한 액수

 

예를 들어

Level Money MaxMoney

1 2 10

 

이렇게 값이 있다고 하면

만약 10시간이 흘렀다고 가정하면

Money가 20이 되는데

tb_A 의 Money 값을 10 으로 업데이트 해야 하는 상황입니다.

 

저 MaxMoney값은 꼭 tb_B에서 참조해야 합니다.

 

도와주세요..

 

 

 

 

 

 

 

이 글에 대한 댓글이 총 4건 있습니다.
CREATE TABLE tb_a
(
iLevel INT
, iMoney INT
, RecvTime DATETIME
)
;
GO
 
CREATE TABLE tb_b
(
iLevel INT
, iMoney INT
, MaxMoney INT
)
;
GO
 
INSERT INTO tb_b( iLevel, iMoney, MaxMoney )
VALUES( 1, 2, 10 )
;
 
INSERT INTO tb_a( iLevel, iMoney, RecvTime )
VALUES( 1, 0, GETDATE() )
;
 
SELECT *
FROM tb_a
;
GO
 
-- 3시간씩 3번 돌려보기
DECLARE @passedHour INT
;
SET @passedHour = 3
;
 
UPDATE tb_a
SET iMoney = (
SELECT MIN( imoney )
FROM ( VALUES( tb_a.iMoney + @passedHour * tb_b.iMoney),( tb_b.MaxMoney ) ) AS tb_k(imoney)
)
FROM tb_a
INNER JOIN tb_b
ON tb_a.iLevel = tb_b.iLevel
;
SELECT *
FROM tb_a
;
GO 3
 
-- 이제 테스트 테이블은 지우는 걸로...
DROP TABLE tb_a;
DROP TABLE tb_b;
우욱님이 2015-05-12 11:55에 작성한 댓글입니다. Edit

우욱 님 너무 감사드립니다.

 

그런데 궁금한게 있는데요

AS tb_k( imoney )

이 구문이 tb_k 를 오타를 치신건지..

아니면 임시테이블에 넣는 건지

궁금합니다

코우지(daum6201)님이 2015-05-12 12:24에 작성한 댓글입니다.

VALUES ( ), ( ) -- 이 부분이 테이블을 구성하게 되어

FROM ( VALUES (), () )

와 같이 FROM 절이 만들어 지는데

SELECT *
FROM( SELECT * FROM tbl )
;

요렇게 하면 테이블 이름이 없어서 에러나지만

SELECT *
FROM( SELECT * FROM tbl ) AS my_tbl
;

요렇게 하면 테이블 이름을 my_tbl로 정해준 것이기 때문에 에러가 나지 않습니다.

이 정도면 AS tb_k 부분의 의문은 해소가 되셨을 것으로 생각이 되구요, 그 뒤의 (imoney) 부분은 테이블이라면 그래도 컬럼 이름이 있어야 하는데, 컬럼 이름이 지정되어 있지 않은 VALUES 구분을 사용했기 때문에 해당 컬럼명을 기술하는 것입니다.

이렇게 만들어지는 2개 row 1개 column 간이 테이블로부터 MIN( )을 구해야 하는데 아까 만들어 둔 imoney라는 컬럼의 이름이 없다면 MIN 값을 구할 수 없기도 하구요...

 

 

우욱님이 2015-05-12 13:02에 작성한 댓글입니다. Edit

답변 감사합니다

코우지(daum6201)님이 2015-05-12 15:21에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6912조직도 하위 부서를 검색하는 쿼리 질문 (__) [3]
초보쿼리
2015-05-27
7322
6911안녕하세요 쿼리질문좀 드립니다. [1]
투루로맨스
2015-05-18
6408
6910조회쿼리 만들기. [2]
초보입니다.
2015-05-18
7733
6909업데이트 쿼리문 질문입니다. [4]
코우지
2015-05-12
5231
6908MS-SQL 날짜 관련 쿼리 질문 [2]
도와주세요
2015-05-11
6742
6907오라클에서 mssql로 쿼리 변환 [2]
yj
2015-05-06
7973
6906MSSQL C programming
과과곽
2015-05-01
4937
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.049초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다