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 6856 게시물 읽기
No. 6856
쿼리나 프로시저 작성 부탁합니다.
작성자
정인수(insoo320)
작성일
2014-10-15 20:42ⓒ
2014-10-16 17:04ⓜ
조회수
6,106

테이블 정보는 다음과 같습니다:

 

 

 

테이블 2개 : table test1, table test2

 

 

 

컬럼(필드) :

 

 

 

table test1 - b_number, title, make_name, year1, year2, year3, sp_book, c_no(join 값)

 

 

 

table test2 - auth_name, auth_name_year, c_title, g_no, c_no(join 값)

 

 

 

 

 

위에서도 언급했지만, c_no값이 두 테이블을 연결하는(조인하는) 컬럼입니다.

 

 

 

이해하기 쉽게 테이블 test1을 책 제목을 입력하는 테이블로, 테이블 test2를 책에 있는 세부 목록을 입력하는 테이블로 이해하시면 편하겠습니다.

 

 

 

 

 

test1에 초기 입력 시 책제목(title), 출판사(make_name), 출판년도 등을 입력하는데(year1), year2와 year3는 미입력 상태입니다.

 

 

 

test2에서는 해당 책에 대한 저자(auth_name), 저자 출생년도(auth_name_year), 소제목(c_title) 등을 입력합니다.

 

 

 

 

 

test1에서는 한 권의 책에 대해 한 번 입력이 원칙이지만, 예외적으로 책의 분량 상 2번 이상으로 입력하는 경우도 있습니다.

 

만약 한 권의 책을 임의로 2권으로 나누었다면, 테이블에 2번을 입력하게 됩니다. 제목을 입력하는 형태는 다음과 같습니다.

 

(예 : XXXX(2-1), XXXX(2-2)...)

 

 

 

만약 동일한 책을 나누어 입력하면 첫 번째 sp_book값은 1이 되고, 두 번째 sp_book값은 2가 되고, 레코드는 2개가 됩니다.

 

 

 

책을 나누어 입력했지만, 결국 동일한 책을 분량상 임의로 나누어 입력한 것이므로 DB상에서는 같은 책으로 인식합니다.

 

 

 

즉, sp_book값만 다르고 b_number값은 동일합니다.

 

 

 

다시 정리하자면, 전체 두 권의 책이 있다고 가정했을 때, 하나는 책의 분량상 두개로 나누어 입력을 해야하고(XXXX(2-1), XXXX(2-2)),

 

한 권은 나누지않고 입력할 경우, 총 table1에서의 레코드 수는 3개가 됩니다.

 

 

 

테이블 구조는 다음과 같습니다.

 

 

 

 

 

 

 

b_number title make_name year1 year2 year3 sp_book c_no(table2와 join 값)

 

-----------------------------------------------------------------------------------------------------

 

0001 제목1(2-1) OOO 2000 null null 001 001

 

0001 제목1(2-2) OOO 2000 null null 002 002

 

0002 제목2 XXX 2010 null null 001 003

 

 

 

 

 

 

 

 

auth_name auth_name_year c_title g_no c_no(table1과 join 값)

 

------------------------------------------------------------------------------------

 

저자1 19600423 생활1 001 001

 

저자2 19740817 생활2 002 001

 

저자3 19690711 생활3 003 001

 

저자4 19710609 생활4 004 002

 

저자5 19750715 생활5 005 002

 

저자6 19670227 생활6 006 003

 

 

 

 

 

 

 

여기서 질문드리겠습니다.

 

test1에서 b_number값이 0001인 year2값에 test2에 있는 auth_name_year값 중 '1960(저자출생년도 최소값 중 앞 4자리)'을 year2값에, '1975(저자출생년도 최대값 중 앞 4자리)'을 year3에 넣고, b_number값이 0002인 year2값에는 test2에 있는 '1967', year3값에는 '1967'값을 넣고 싶습니다.

 

즉, test1에서의 b_number값이 같으면 year2와 year3에 동일한 값을 넣고자 합니다.

 

쿼리나 프로시저로 가능할 지 궁금합니다.

 

답변주시면 감사하겠습니다.^^

 

 

 

 

 

이 글에 대한 댓글이 총 3건 있습니다.
WITH t1 ( b_number, title, make_name, year1, year2, year3, sp_book, c_no )
AS(
SELECT '0001', '제목1(2-1)', 'OOO', '2000', null, null, '001', '001'
UNION ALL SELECT '0001', '제목1(2-2)', 'OOO', '2000', null, null, '002', '002'
UNION ALL SELECT '0002', '제목2', 'XXX', '2010', null, null, '001', '003'
)
, t2 ( auth_name, auth_name_year, c_title, g_no, c_no )
AS(
SELECT '저자1', '19600423', '생활1', '001', '001'
UNION ALL SELECT '저자2', '19740817', '생활2', '002', '001'
UNION ALL SELECT '저자3', '19690711', '생활3', '003', '001'
UNION ALL SELECT '저자4', '19710609', '생활4', '004', '002'
UNION ALL SELECT '저자5', '19750715', '생활5', '005', '002'
UNION ALL SELECT '저자6', '19670227', '생활6', '006', '003'
)
SELECT * 
FROM t1
INNER JOIN (
SELECT c_no, MIN( LEFT( auth_name_year, 4 ) ) AS y2, MAX( LEFT( auth_name_year, 4 ) ) AS y3
FROM t2
GROUP BY c_no
) AS t3 
ON t1.c_no = t3.c_no
;
 
우욱님이 2014-10-16 13:17에 작성한 댓글입니다. Edit

답변감사합니다.^^

 

근데, 죄송하지만 질문을 하나만 더 드리도록 하겠습니다.

 

테이블 test1에 있는 b_number값이 0001인 레코드에 동일한 year2와 year3값을 넣으려고 합니다. 즉, 테이블 test1의 b_number값이 같으면 year2(최소값)와 year3(최대값)에 동일한 값을 넣고자 합니다.

 

0001 제목(2-1) OOO 2000 1960 1975 001 001

 

0001 제목1(2-2) OOO 2000 1960 1975 002 002

 

위와 같이 데이터를 얻고자 하면 어떤 구문을 추가하거나 수정해야 하는지 다시한번 알려주시면 고맙겠습니다.

 

댓글 달아주신 쿼리를 통해 고민을 많이 했는데, 도저히 모르겠습니다..ㅠㅠ

 

답변주시면 감사하겠습니다.^^

 

 

정인수(insoo320)님이 2014-10-16 16:39에 작성한 댓글입니다.
이 댓글은 2014-10-16 16:42에 마지막으로 수정되었습니다.
WITH t1 ( b_number, title, make_name, year1, year2, year3, sp_book, c_no )
AS(
SELECT '0001', '제목1(2-1)', 'OOO', '2000', null, null, '001', '001'
UNION ALL SELECT '0001', '제목1(2-2)', 'OOO', '2000', null, null, '002', '002'
UNION ALL SELECT '0002', '제목2', 'XXX', '2010', null, null, '001', '003'
)
, t2 ( auth_name, auth_name_year, c_title, g_no, c_no )
AS(
SELECT '저자1', '19600423', '생활1', '001', '001'
UNION ALL SELECT '저자2', '19740817', '생활2', '002', '001'
UNION ALL SELECT '저자3', '19690711', '생활3', '003', '001'
UNION ALL SELECT '저자4', '19710609', '생활4', '004', '002'
UNION ALL SELECT '저자5', '19750715', '생활5', '005', '002'
UNION ALL SELECT '저자6', '19670227', '생활6', '006', '003'
)
SELECT t1.b_number, t1.title, t1.make_name, t1.year1, MIN( LEFT( t2.auth_name_year, 4 ) ), MAX( LEFT( t2.auth_name_year, 4 ) ), t1.sp_book, t1.c_no
FROM t1 INNER JOIN t2 ON t1.c_no = t2.c_no
GROUP BY t1.b_number, t1.title, t1.make_name, t1.year1, t1.sp_book, t1.c_no
;
 
우욱님이 2014-10-17 13:11에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6859NULL 인식문제.. [2]
우암
2014-10-20
5890
6858디비 쿼리 질문드립니다.! [4]
이성주
2014-10-20
6270
6857MSSQL 쿼리 질문드립니다. [7]
학생
2014-10-20
7329
6856쿼리나 프로시저 작성 부탁합니다. [3]
정인수
2014-10-15
6106
6855mssql 에서 select 시 레코드 결과 수 지정 [2]
송영미
2014-10-14
5828
6853두개의 테이블을 조회후 조건쿼리 [3]
김우성
2014-09-29
6158
6852랭킹정보 업데이트 하기 [1]
고영훈
2014-09-26
6672
Valid XHTML 1.0!
작업시간: 0.059초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다