오라클 쿼리 질문입니다 0 6 2,025

by 모델장윤주 [2014.11.19 11:29:08]


SELECT A.ID, A.NAME, A.ADRESS, A.PHONE, .... 

FROM TABLE_A A

WHERE A.ID IN ('A', 'B', 'C', 'D', 'E' ...)

이런 쿼리문이 있을 때...

AND 조건으로

AND EXISTS ( SELECT 'O' FROM TABLE_B WHERE A.ID = B.DATA_ID AND B.KIND = 'TEST' AND B.ID IN ('AA', 'BB', 'CC', 'DD') ....

 

이런 조건을 추가해서 작업을 했습니다.

저렇게 추가한 이유는.. 먼저 보이는 SELECT 절은 그냥 일반적으로 TABLE_A에서 가져오는 쿼리절이구요

두번째 AND EXISTS의 B.ID는 특정 사용자마다 검색할 수 있는 조건입니다.

저렇게 했을 땐 , 특정 사용자가 검색할 수 있는 조건에 한해서 쿼리를 해오는데요

기본적으로 B.ID 값이 없는 값도 들고오게 하려면 어떤식으로 쿼리를 만들어야 하나요?

아.. TABLE_B는 조인테이블입니다.
TABLE_A , TABLE_C ( 사용자가 검색할 수 있는 AA, BB, CC, DD .. 목록 ) , TABLE_B ( TABLE_A, TABLE_C 조인 테이블 )

by jkson [2014.11.19 11:51:16]

B테이블에 ID값('AA', 'BB', 'CC', 'DD'..)이 일종의 권한 같은 건가요? B.ID에 값이 없다는 것은 B테이블에 A테이블 ID값에 해당하는 DATA_ID는 존재하지만 B테이블의 ID컬럼 값이 NULL인 조건을 말씀하시는 것인가요?


by 모델장윤주 [2014.11.19 12:23:56]

글을 너무 못써서 죄송합니다 ㅠㅠ
네. B테이블에 있는 값은 사용자가 다른 화면에서 지정할 수 있는 권한입니다. 설정값은 C테이블에 있는 값을 가져와서 입력합니다. (C테이블에 있는 값 : AA, BB,CC,DD, EE ) .... 만약 T 사용자가 권한 수정을 통해 ( AA , BB , CC ) 검색 권한을 줬을 때,  검색은 C 테이블에 있는 값이 모두 나오도록 하게 하고 싶습니다.

B테이블에 있는 PK값은 3개입니다. ( B.ID(조인테이블에 있는 PK값), DATA_ID(다른 테이블의 내부 PK값), 구분값(예를들어.. '한식', '중식', '양식'..) ) 이런식입니다.

B.ID에 값이 없다는 건 이 사용자가 해당 구분값을 선택을 할 수 없다는걸 의미합니다.


by jkson [2014.11.19 13:03:00]

제가 이해력이 좀 안 좋아서..

EXISTS ( SELECT 'O' 
           FROM TABLE_B 
          WHERE A.ID = B.DATA_ID 
            AND B.KIND = 'TEST' 
            AND (B.ID IN ('AA', 'BB', 'CC', 'DD')
              OR B.ID IS NULL)
        )

단순히 B.ID가 값이 없어도 조회가능하게 하려면

그냥 값이 NULL인 것도 나오게 하면

되는 것 아닌가요? 제가 이해를 잘 못한 것인지..

이런 걸 물어보지는 않으셨을 것 같은데..;


by 마농 [2014.11.19 12:21:24]

설명이 너무나도 추상적이고 자기중심적입니다.
혼자만 아는 얘기를 쓰지 마시고, 다른 사람이 알아들을 수 있도록 설명해 주세요.
- 두 테이블 a, c 의 내역(pk 및 사용되는 항목)
- 두 테이블 a, c 의 관계(조인키 및 대응관계(1:1, 1:m))
- 조인 뷰 b 가 필요한 이유? c만 걸어도 될 듯 한데???
- 업무로직이 어떻게 되는지?


by 모델장윤주 [2014.11.19 12:46:41]

죄송합니다. 제가 다시 읽어봐도 너무 글을 못썻네요 ㅠㅠ


실제적으로 사용된 테이블은 3개입니다.
A테이블, B테이블, C테이블 ( B테이블, C테이블은 추가된 테이블입니다.)

A테이블은 기존 사용하던 테이블 ( ID(PK), NAME, ADDRESS, GUBUN ... )
B테이블은 A와 C의 조인테이블 ( GUBUN, C테이블의 CID, A테이블의 DATA_ID ( 3개를 묶어 PK로 잡았습니다.) ... )
( B테이블의 구분값은 해당 테이블의 특징을 말합니다. 화장품을 예로 들어 GUBUN='향수', GUBUN='스킨' 이런 값들이 들어가게 됩니다.)
C테이블은 특정 값이 들어 있는 테이블입니다. ( CID(PK), CNAME, CADDRESS ... )

C테이블의 값은 고정이고 A테이블 말고도 여러개의 테이블을 연결할 수 있습니다. 해당 테이블 ID(PK)를 통해서..

A와 C테이블은 B테이블을 통해 조인하게 됩니다.

현재 C 테이블에 ( AA, BB, CC, DD, EE ) 값이 있다고 가정.

사용자 T가 사용자 설정을 통해서 권한을 수정함
( 기존에는 따로 권한이 없었음 -> 설정을 통해서 AA,BB,CC만 수정, 삭제 할 수 있도록 변경 )

A가 검색된 화면 ( 질문에 올렸던 쿼리문으로 변경 ( 기존 쿼리문은 AND EXISTS .. 이 부분이 없었습니다 ) ) 
에서 추가된 EXISTS ( SELECT 'O'
          FROM TABLE_B B 
          WHERE A.ID = B.DATA_ID
           AND B.GUBUN = '향수'
           AND B.CID IN ('AA', 'BB', 'CC') ) 

이런 형태입니다.
하지만 B.CID값이 없더라도 검색은 되게 하고 싶습니다.


by 마농 [2014.11.19 13:09:59]

이해가 안갑니다.
각 사용자마다 권한이 다를텐데요?
 - B.CID IN ('AA','BB','CC') 이렇게 상수값으로 조건을 주는게 맞는지 의문이네요?
B.CID값이 없더라도 검색은 되게 하고 싶습니다. 라고 하셨는데요?
- 이게 도데체 어떤 뜻인지?


글로 설명하시면 설명도 어려울 뿐더러 읽는 사람의 이해도 어렵습니다.
백문이불여일견이라 긴설명보다는 자료 예시를 보여주시는게 좋을 듯 합니다.
 - 테이블 원본자료예시와 그에 따른 결과 예시를 표형태로 보여주세요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입