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 6914 게시물 읽기
No. 6914
select 후 insert 질문입니다.
작성자
꽃씨하나(wtb0307)
작성일
2015-06-18 13:39
조회수
6,167

select 후 insert 질문입니다.

 

 

요구 작업

 

학생이 수강신청을 하면 [수강신청 테이블]에 insert 되고

관리자가 승인을 해주면 [학생 수강 테이블]에 insert 되는 작업입니다.

 

위의 내용은 첫번째 한번은 잘 되지만 학생이 같은 과목을 중복으로 신청할 경우

문제가 생깁니다.

즉, 학생이 실수 또는 고의로 같은 과목을 중복으로 신청을 하게 되면 (유료 또는 무료로)

관리자가 생각없이 승인을 하게 되면 그 해당 학생은 중복으로 과목이 생성되게 됩니다 ㅜ

 

 

 

수강 신청 테이블 A가 있습니다.

 

데이터는 아래와 같이 입력 되어 있습니다

 

 

순번 || 아이디 || 이름 || 과목코드 || ...

 

1 aaa 이름1 000001

2 bbb 이름2 000001

 

 

 

학생 수강 테이블 B가 있습니다.

 

데이터는 아래와 같이 입력 되어 있습니다

 

 

순번 || 아이디 || 이름 || 과목코드 || 수강 횟수 || 수업시작일 || 수업 종료일 +...

 

1 aaa 이름1 000001 1 20130101

2 bbb 이름2 000001 1 20130101

 

 

쿼리는 아래와 같습니다.

 

insert [학생 수강 테이블] (

아이디 , 이름 , 과목코드 , 수강횟수 , 수업시작일 , 수업 종료일

)

select 아이디 , 이름 , 과목코드 ,....

from [수강신청 테이블]

where 과목코드 = 000001

 

 

질문 : 위의 수강횟수를 가지고 몇번째 수강 신청인지를 가져 오고 싶은데요

select 후 insert 를 하고 싶은데요 .. 어떻게 하면 학생 개별로

수강횟수를 가져올 수 있을까요?

 

 

 

 

이 글에 대한 댓글이 총 5건 있습니다.
INSERT [학생 수강 테이블] (
아이디 , 이름 , 과목코드 , 수강횟수 , 수업시작일 , 수업 종료일
)
SELECT 아이디 , MAX(이름) , 과목코드 ,....
FROM [수강신청 테이블]
WHERE 과목코드 = 000001 -- 왜 WHERE가 있어야 되는지는 잘 모르겠지만
GROUP BY 아이디, 과목코드
;
 
우욱님이 2015-06-18 14:44에 작성한 댓글입니다.
이 댓글은 2015-06-18 15:51에 마지막으로 수정되었습니다. Edit

우욱님.

 

위에 where 은 해당 과목만 가져올려고 했습니다.

 

또 말씀하신 쿼리가 이해가 잘 안됩니다;;

제가 원하는 것은 기존에 학생이 해당 과목 00001을 수강했던 횟수가 1이면

다음에 수강 할 경우 그 값을 +1 해서 insert 할려는 건데요.

 

아. 제가 써 놓고도 제 글이 이해가 잘 안되는;;

 

꽃씨하나(wtb0307)님이 2015-06-18 15:13에 작성한 댓글입니다.

1.  가장 우선 스키마의 정규화가 필요합니다.
본 사례 중에 가장 대표적인 예: "이름"
학생 테이블에 존재하는 학생 이름이 수강신청 테이블, 수강 테이블에 존재해야 해야할 이유가 없는거죠.
 

2.  중복 수강 신청의 경우
애초에 수강신청 테이블에 (학생ID, 과목ID)에 UNIQUE 조건을 걸어두고 입력이 안되도록 하는 것은 기본이요, 프로그램 단에서 같은 과목을 두 번 이상 신청하는 경우 경고 및 신청 불가처리하여 진행되는 것이 바람직하겠습니다.

 

-- 그런데 중복 입력된 수강신청이 있다고 했을때 이를 1회만 수강 테이블에 넣는 게 문제인 건가요? 아니면 수강 횟수를 잘 맞춰야 하는 것이 문제인 건가요?  그걸 잘 모르겠... --_--;;

우욱님이 2015-06-18 16:06에 작성한 댓글입니다. Edit

우욱님 말씀이 맞습니다.

 

1.의 정규화의 경우 이름이 있는 것은 예시로 든거라;;

2. 중복 수강신청의 경우

애초에 프로그램 단에서 막는다고 하셨는데요 이게 가장 이상적이고

이렇게 해야만 하는 것이지만..

 

저희 사이트 정책상

예를 들어 [토익 1] 한달짜리 과정이 있다고 치면

이 과정은 늘 열려있는 상시과정입니다. 그래서 과목코드가 1년 내내 동일하구요

또 한달뒤에 수강기간이 마감되면 학생은 동일 과정을 연장하거나 새롭게 듣거나 할 수 있습니다.

수강생이 결제를 하고 관리자가 승인을 해야지 과목이 오픈데는데요

관리자 승인전에 수강생이 실수 또는 고의로 중복으로 수강신청을 할 수가

있습니다.

 

그래서 제가 생각한 해결 방법이 수강신청 카운트를 체크해서 처리를 하면

되지 않을까? 였습니다.

 

 

 

꽃씨하나(wtb0307)님이 2015-06-18 16:31에 작성한 댓글입니다.

회사 정책(policy)이 전산에 맞춰지는 건가요? ㄷㄷㄷ

  • 수강이 연장이 되는지...
  • 수강 중 특정 사유에 의해 연기되는 정책은 있는지..
  • 수강 취소 정책이 존재하는지...

등등 여러 관련된 정책에 맞아야 하지 않을까 싶긴 한데요..
(사실 질문 중에도 "연장"도 있고 "새롭게 듣거나"도 있어서 이러한 부분이 어떻게 다른지도 확인하고 이에 따른 구현이 필요할 것으로 생각됩니다.)

실수로 수강 신청을 중복한 경우 2회 수강신청 됨을 알리고 결제를 진행하되

  • 기간을 2배로 줄 것인지
  • 2회 연속 수강으로 진행할 것인지
  • 아예 이러한 중복 신청을 받지 않을 것인지(장사하는 입장에서는 고객의 실수가 아니라면 굳이 안 받을 이유가 없을테지만...)

등의 정책이 필요할테고, 이에 수반하는 취소 등이 발생했을때의 정책도 필요하겠죠...

 

이미 배가 산으로 가는 느낌이 나긴하지만...

더 중요한 문제는 말씀 중에 2회 중복 결제가 된 고객의 경우 DB에 1회만 등록한다면 등록되지 않은 1회에 대한 환불은 어떻게 하실지가 좀 많이 궁금하다는 말씀을 드리면서...

INSERT INTO 수강테이블
SELECT 수강자ID, 강좌ID, COUNT( 수강횟수) -- MAX( 수강횟수)를 쓸 수도 있고.. 단, 취소 등이 발생했을때 이를 테이블에 남겨두는지 아닌지 등등 업무적인 요소가 들어갑니다.
FROM 수강신청테이블 AS tApply
LEFT JOIN 수강테이블 AS tReg
    ON tApply.수강자ID = tReg.수강자ID
    AND tApply.강좌ID = tReg.강좌ID
WHERE 강좌ID = '강좌코드'
GROUP BY 수강신청테이블.수강자ID, 수강신청테이블.강좌ID
;

정도가 될거 같긴 한데... 아무리 생각해봐도 수강신청테이블은 저렇게 INSERT한 후에 지우시는건지 아니면 수강테이블로 넘어갔다고 표시하는 필드가 있는건지 등등 알 수가 없으므로.. 걍 이정도... ㅋㅋ

우욱님이 2015-06-18 17:26에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6917쿼리 질문입니다.
멤멤
2015-08-19
4941
6916주차에 관련하여 질문있습니다. [1]
MSSQL
2015-07-08
6009
6915ms-sql을 -> mysql로 바꾸려면..
김다윗
2015-07-03
5050
6914select 후 insert 질문입니다. [5]
꽃씨하나
2015-06-18
6167
6913SQL 초보자 입니다. [1]
혀니
2015-06-15
6112
6912조직도 하위 부서를 검색하는 쿼리 질문 (__) [3]
초보쿼리
2015-05-27
7468
6911안녕하세요 쿼리질문좀 드립니다. [1]
투루로맨스
2015-05-18
6566
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다