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
운영게시판
최근게시물
Oracle Q&A 21895 게시물 읽기
No. 21895
쿼리문을 어떻게 작성해야 할지..
작성자
이찬희
작성일
2005-03-04 02:17ⓒ
2005-03-04 10:40ⓜ
조회수
1,268

KMNUMB_TB (과정테이블)

=====================

LEC_CD(PK) : 과정코드

DISPARTY(PK) : 차수

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

LEC_DTL_NM : 과정명

REG_ID : 등록자

 

 

KMEDUOBJ_TB (과정-학습대상 테이블)

=====================

LEC_CD(PK) : 과정코드

DISPARTY(PK) : 차수

SCHOOL_GB(PK) : 학교구분 : 초등,중등,고등

GRADE_GB(PK) : 학년구분 : 1,2,3,4,5,6학년

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

REG_ID : 등록자

 

 

위의 두 테이블(KMNUMB_TB, KMEDUOBJ_TB)이 1:M 관계로 되어있습니다.

 

과정테이블 : KMNUMB_TB('1', 1, '컴퓨터이해', 'ADMIN')

('2', 1, '수학의이해', 'ADMIN')

('3', 1, '국어의이해', 'ADMIN')

과정-학습대상 테이블 : KMEDUOBJ_TB('1', 1, 'MIDDLE', 1, 'ADMIN')

('2', 1, 'HIGH', 1, 'ADMIN')

위와 같이 자료가 들어가 있을때

 

과정테이블 리스트(목록)를 출력하고자 할때

과정테이블에는 과정코드='3'이고 차수=1인 '국어의이해'과정이 있지만

과정-학습대상 테이블에는 과정코드가 '3'이고 차수가 1인 학습대상이 없습니다.

이럴때

리스트 출력시 쿼리를 어떻게 해야 하나요?

 

그리고

리스트 출력시 과정-학습대상을 검색조건으로 가진다면

어떻게 쿼리를 짜야하나요?

 

SELECT *
FROM (SELECT ROWNUM rn, TARGET.*
FROM (SELECT DISTINCT A.LEC_CD,
A.DISPARTY,
A.LEC_DTL_NM
FROM KMNUMB_TB A,
KMEDUOBJ_TB B
WHERE A.LEC_CD = B.LEC_CD(+)
AND A.disparty = B.disparty(+)

AND (B.school_gb IS NULL OR B.school_gb LIKE '%%')
AND (B.grade_gb IS NULL OR B.grade_gb LIKE '%%')
ORDER BY A.lec_cd ASC) TARGET)
WHERE rn BETWEEN 0 and 10
ORDER BY rn DESC

 

위와 같이 하면...

과정테이블의 과정코드가 '3'이고 차수가 1인 과정은 리스트에 나타나지 않습니다.

 

이 글에 대한 댓글이 총 1건 있습니다.

쿼리의 의도를 이해하기 힘들군요...

그냥 A를 전부 추출하기 위한 목적이라면..

B와 조인할 이유가 없으며(A의 내용만 DISTINCT로 추출하고 있죠)

 

B의 조건에 해당하는 A만 추출하고자 한다면..

SELECT A.LEC_CD,
A.DISPARTY,
A.LEC_DTL_NM
FROM KMNUMB_TB A

WHERE (A.LEC_CD, A.disparty ) IN

(SELECT B.LEC_CD, B.disparty

 FROM KMEDUOBJ_TB B
 WHERE B.school_gb LIKE '%%'

 AND B.grade_gb LIKE '%%')

 

A의 모든 내용을 추출하면서

B의 컬럼도 추출해야하고 B의 조건이 필요하다면...

SELECT A.LEC_CD,
A.DISPARTY,
A.LEC_DTL_NM,
B.school_gb,

B.grade_gb

FROM KMNUMB_TB A,
KMEDUOBJ_TB B
WHERE A.LEC_CD = B.LEC_CD(+)
AND A.disparty = B.disparty(+)

AND B.school_gb(+) LIKE '2%'
AND B.grade_gb(+) LIKE '1%'
ORDER BY A.lec_cd ASC

 

위처럼 해야 정확한 값을 추출할 수 있습니다.

위처럼 하면 A는 모든 ROW가 나오지만..

B는 조건에 맞는 내용만 추출 되겠죠..

 

mur님이 2005-03-04 14:21에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
21898특정컬럼이 포함된 테이블 조회 [1]
궁금이
2005-03-04
1370
21897inline view join을 일반 join으로 바꾸려면? [1]
송찬의
2005-03-04
1556
21896[급!]동시 사용시 테이블 점유에 대해서... [3]
궁실
2005-03-04
1455
21895쿼리문을 어떻게 작성해야 할지.. [1]
이찬희
2005-03-04
1268
21894Oracle10g(Windows2003)conn / as sysdba --error??? [2]
구리구루
2005-03-04
2174
21892고수님들 부탁 드립니다. tablespace 사이즈가 갑자기 증가 했네요? [2]
임은식
2005-03-03
3110
21891한글이 [¡¾??¡Æ] [¡Æ?ª??] 이렇게 깨짐니다. [1]
김정우
2005-03-03
3460
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다