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 6872 게시물 읽기
No. 6872
데이터그리드뷰에 데이터를 불러와 뿌려줘야하는데 join이 너무 많이 쓰입니다.
작성자
kshap(ksw0829)
작성일
2015-01-12 20:57
조회수
5,575

안녕하세요 이제 막 시작한 신입입니다

 

서버 db 테이블에서 데이터그리드뷰에 데이터를 뿌려줘야하는데 테이블이 많이 쪼개져 있고

 

뿌려줘야하는 필드도 많고 기준이 되는 테이블을 기준으로 조인되는 테이블쪽이 널이어도 뿌려줘야해서

 

left 조인을 썼습니다. 그러다보니 표현해야하는 건 많고 left join이 너무 많이 쓰게 됐습니다...

 

join을 줄이고 하는 방법이 없을까요..ㅠㅠ

 

 

 

select a.Nm, a.Ceo, c.dName, a.Tel , a.Hp, a.Addr, d.cName, e.ncName, h.CmName, m.cmname, n.Montly, a.pDate

 

from Tb_Cu a left join Tb_Info b on a.Idx = b.Idx left join Tb_Code c on a.Dept = c.Cm left join Tb_Bran d on a.Office = d.Idx left join Tb_Bran e on a.Sale = e.Idx left join Tb_ComCo h on a.gr = h.Snd left join Tb_Rev k on a.Idx = k.Idx left join Tb_Bg l on a.Idx = l.idx left join tb_comco m on l.bil = m.snd left join Tb_Bg n on a.Idx = n.Idx where k.code = ''

 

 

 

sql문이 너무 복잡하죠? ㅠㅠ

 

문제는 예를들어 기준이되는 a테이블이 몇개의 컬럼이 다른 한 테이블(소분류 되어있는 테이블)의 키값을 갖고 있습니다.

 

그래서 같은 테이블을 이름을 달리주어서 여러번 조인 시킨겁니다...

 

제 설명이 부족해서 잘 못알아들으실까봐 걱정입니다...

 

 

 

조언부탁드립니다...

 

 

 

 

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

쿼리 작성 기준이 없이 무작정 길게 늘여쓰면 당연히 복잡하지요.
줄바꿈과 들여쓰기, 대소문자 구분을 적절히 사용하면 하나도 안복잡합니다.
조인이 필요한 부분을 무작정 뺄수는 없구요.
작성된 쿼리를 보면 아우터 조인을 한 테이블을 전혀 사용을 안하는것도 있네요.
필요없는 것까지 조인한듯 하니 이런건 아예 빼는게 맞죠.
그리고 아우터 조인 사용이 맞는지도 확인하셔야 할 듯 하네요.
메인테이블이 Not Null 이고 코드 테이블과 조인하는 경우엔 이너조인이 맞죠.


SELECT a.Nm, a.Ceo, c.dName, a.Tel, a.Hp, a.Addr
     , d.cName
     , e.ncName
     , h.CmName
     , m.cmname
     , n.Montly
     , a.pDate
  FROM Tb_Cu a
--LEFT JOIN Tb_Info  b ON a.Idx    = b.Idx
--LEFT JOIN Tb_Code  c ON a.Dept   = c.Cm
  LEFT JOIN Tb_Bran  d ON a.Office = d.Idx
  LEFT JOIN Tb_Bran  e ON a.Sale   = e.Idx
  LEFT JOIN Tb_ComCo h ON a.gr     = h.Snd
  LEFT JOIN Tb_Rev   k ON a.Idx    = k.Idx
  LEFT JOIN Tb_Bg    l ON a.Idx    = l.idx
  LEFT JOIN tb_comco m ON l.bil    = m.snd
  LEFT JOIN Tb_Bg    n ON a.Idx    = n.Idx
 WHERE k.code = ''
;

마농(manon94)님이 2015-01-13 09:22에 작성한 댓글입니다.

답글 감사합니다!

일단 말씀하신 사용안하는 테이블의 조인은 뺐습니다..

메인테이블에서 null이어도 결과가 나와야해서

left 조인을 썼습니다...

 

근데 보통 조인이 4~5번을 넘으면 문제가 되고

좋은 방법이 아니라고 하더라구요...

그래서 다른 방법을 찾고 있습니다만...

어떻게 생각하시는지요

kshap(ksw0829)님이 2015-01-13 09:36에 작성한 댓글입니다.

쓸데 없는 조인이라면 문제가 되지만 꼭 필요한 조인은 문제가 아니죠.
물론 성능문제를 생각할 수 있겠지만
성능 이전에 조인이 필요한지 아닌지가 우선이라 생각됩니다.
조인이 안좋다고 하니 조인을 쓰지 말자??? 이건 아니라고 생각됩니다.
같은 테이블을 여러번 조인하는 것은 테이블 설계에서 부터 그렇게 된거구요.
테이블 설계를 바꾸지 않는 한 조인은 어쩔 수 없는거겠지요.
조인을 스칼라서브쿼리로 바꿀수도 있구요 함수로 만들어 사용도 가능하지요.
조인이 아닌것처럼 보일수도 있지만 조인의 연장선이라 볼 수 있구요.
이런것들이 더 나은 성능을 보장하지는 않습니다.


SELECT a.Nm, a.Ceo, c.dName, a.Tel, a.Hp, a.Addr
     , (SELECT d.cName  FROM Tb_Bran  d WHERE a.Office = d.Idx) cName
     , (SELECT e.ncName FROM Tb_Bran  e WHERE a.Sale   = e.Idx) ncName
     , (SELECT h.CmName FROM Tb_ComCo h WHERE a.gr     = h.Snd) CmName
     , (SELECT m.cmname FROM Tb_Bg l LEFT JOIN tb_comco m ON l.bil = m.snd
         WHERE a.Idx = l.idx) cmname
     , (SELECT n.Montly FROM Tb_Bg    n WHERE a.Idx    = n.Idx) Montly
     , a.pDate
  FROM Tb_Cu a
 INNER JOIN Tb_Rev k ON a.Idx = k.Idx
 WHERE k.code = ''
;


k 의 경우 Left 조인 후에 Where 조건을 주면 아우터 조인을 한 효과가 없죠.
Inner Join 이 맞을 듯 합니다.

마농(manon94)님이 2015-01-13 09:56에 작성한 댓글입니다.
이 댓글은 2015-01-13 09:58에 마지막으로 수정되었습니다.

-- 다시 자세히 보니 l 과 n 이 동일한 키로 조인되네요. n 은 필요 없겠네요.
SELECT a.Nm, a.Ceo, c.dName, a.Tel, a.Hp, a.Addr
     , d.cName
     , e.ncName
     , h.CmName
     , m.cmname
     , l.Montly    -- n.Montly
     , a.pDate
  FROM Tb_Cu a
 INNER JOIN Tb_Rev   k ON a.Idx    = k.Idx
  LEFT JOIN Tb_Bran  d ON a.Office = d.Idx
  LEFT JOIN Tb_Bran  e ON a.Sale   = e.Idx
  LEFT JOIN Tb_ComCo h ON a.gr     = h.Snd
  LEFT JOIN Tb_Bg    l ON a.Idx    = l.idx
  LEFT JOIN tb_comco m ON l.bil    = m.snd
--LEFT JOIN Tb_Bg    n ON a.Idx    = n.Idx
 WHERE k.code = ''
;

마농(manon94)님이 2015-01-13 10:04에 작성한 댓글입니다.
이 댓글은 2015-01-13 10:06에 마지막으로 수정되었습니다.

정말 자세한 설명 감사드립니다.

저에게 도움이 되는 답글이었습니다

감사합니다!!

kshap(ksw0829)님이 2015-01-13 10:05에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6875MSSQL JDBC Driver Version 1 [2]
유상진
2015-01-21
6136
6874WHERE 절에서 멀티 값을 주고 싶습니다. [1]
이성원
2015-01-20
5011
6873MSSQL 2014 하위버전 차이점 아시는분? [1]
노지석
2015-01-19
6357
6872데이터그리드뷰에 데이터를 불러와 뿌려줘야하는데 join이 너무 많이 쓰입니다. [5]
kshap
2015-01-12
5575
6871Query 좀 가르쳐 주세요~ [5]
한강현
2015-01-11
5676
6870안녕하세요. 쿼리 질문좀 드릴려고합니다. [10]
초보자
2015-01-06
5607
6868[질문] OSQL을 배치파일로 만들어서 사용하는방법 문의
정규성
2014-12-16
5030
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다