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 1604 게시물 읽기
No. 1604
세개의 테이블 조인연결 방법?
작성자
장필교(maybeto)
작성일
2004-10-08 00:44
조회수
3,717

select prb.probe_groupid, prb.probe_groupparentid,
sum(ipmac_cnt.tot_cnt), sum(consolidate_cnt.win_cnt)
from ( select probe_groupid, probe_groupparentid
from probe_group_master
) prb,
( select ip.probeid probeid, count(ip.IP) tot_cnt

from ipmac_table ip
group by ip.probeid
) ipmac_cnt,
( select ip.probeid probeid, ip.IP, ip.mac, ip.oscode, ip.osname,
case when ip.oscode like '8%' then 1
else 0
end win_cnt,
dsc.field_0
from ipmac_table ip inner join desc_data dsc
on ip.ip = dsc.ip
where ip.registed = 'Y'

) consolidate_cnt
where prb.probe_groupid = ipmac_cnt.probeid
and prb.probe_groupid = consolidate_cnt.probeid

group by prb.probe_groupid, prb.probe_groupparentid


MS SQLServer 조인방법이 아직 익숙치 않네요

한테이블에서 다른 두 테이블에 조인하는 방법을 이리저리해봐두 잘 모르겠네요.

좀 부탁드립니다.

 

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

일단 주신 sql문으로는 세개의 테이블

prb, ipmac_cnt, consolidate_cnt이 각각  inner 조인 형태입니다.

또한 두가지 문제가 있지 않을까 예상됩니다.

첫번째는 삼단 논법상 A = B 이고 A = C 이면,B = C 이다

라는 말이 성립하므로 innert조인이 된 것이라고 예상됩니다.

그런데 ipmac_cnt.probeid =! consolidate_cnt.probeid라면

여기서 조인이 잘 못되었지 않나 싶습니다.

두번째는 prb.probe_groupid의 정보 >=  (ipmac_cnt.probeid정보) + (consolidate_cnt.probeid정보)라면 아마도 예상하는 출력의 모습은

정확할 겁니다.

누적된 정보의 차이(양적인 차이 예를 들면 prb에는 없는데 consolidat,probeid에는 있는등)로 인한 것이라면 inner 조인의 형태는 안되겠지요,

outer join을 하기 위해서는 = 의 왼쪽 또는 오른쪽에 '+' 를 붙여

만들수 있습니다.

 

MS_sqler의 형태라면 Left outer join ~ on , Righter Outer Join ~ on

의 모습이 되겠지요 ^^

 

세개의 테이블의 스키마와 샘플데이터 그리고 출력의 모습

이렇게 주시면 정확한 답이 나오지 않을까 생각됩니다.

 

 

여리님이 2004-10-08 10:10에 작성한 댓글입니다. Edit

윗문장을 그대로 바꾼다면...

이러면 될 거 같구..

select prb.probe_groupid,
       prb.probe_groupparentid,
       ipmac_cnt.tot_cnt,
       consolidate_cnt.win_cnt
from (
    select ip.probeid probeid,
           isnull(sum(when ip.oscode like '8%' then 1 End), 0) win_cnt
    from ipmac_table ip
    where ip.registed = 'Y'
    and exists
        (select 'x'     /* 원래 sql에서 desc_data는 exist 기능밖에 없는 듯 */
         from desc_data dsc
         where ip.ip = dsc.ip)
    group by probeid    /* 원래 sql에서 group by 가 누락된 듯 */
    ) consolidate_cnt,
    (select ip.probeid probeid,
            count(ip.IP) tot_cnt
     from ipmac_table ip
     group by ip.probeid
     ) ipmac_cnt,
     probe_group_master prb
where prb.probe_groupid = ipmac_cnt.probeid
and consolidate_cnt.probeid = ipmac_cnt.probeid

 

desc_data 테이블을 굳이 넣지 않아도 된다면..

아래처럼 해도 의도에 맞지 않나요?

아래와 같이 쓰는 것이 훨씬 효율적이겠죠.
select b.probe_groupid,
       b.probe_groupparentid,
       a.tot_cnt,
       a.win_cnt
from (select probeid,
             count(*) tot_cnt,  /* 단지 전체 갯수을 세려면 이렇게 */
             isnull(sum(when oscode like '8%'

                               and registed = 'Y' then 1 End), 0) win_cnt
      from ipmac_table
      group by probeid ) a,
      probe_group_master b
where b.probe_groupid = a.probeid

 

참고로 말씀드리면 outer join 구문을 제외하고는

SQL Server에서도 고전적인 SQL문법이 정확하게 작동합니다.

SQL Server에서 반드시 outer join을 사용해야 경우가 아니라면

굳이 ANSI 문장 방식에 연연하실 필요없습니다..

sql님이 2004-10-09 22:26에 작성한 댓글입니다.
이 댓글은 2004-10-09 22:37에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1608mssql서버가 자꾸 죽어요 [2]
초보자
2004-10-09
2474
1606특정 레코드의 값들이 변경되는데 이유를 아시는 분 좀 알려 주세요... [1]
초보 SQL
2004-10-08
1946
1605[질문] 고수님들 테이블 쪼개기, 순번 붙히기 질문좀
우기
2004-10-08
2918
1604세개의 테이블 조인연결 방법? [2]
장필교
2004-10-08
3717
1603select 활용 질문 [3]
Gun
2004-10-07
2811
1602조회시에 없는값만을 취하려고 할때 질문입니다. [2]
와우
2004-10-07
3142
1600데이터 베이스 백업
김민영
2004-10-05
2598
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.027초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다