일 대 다 관계의 테이블이 있습니다.
이것을 쿼리 해서 화면에 표현해 주려하는데요.
1.조인 쿼리후 레코드셋으로 받아 루프돌며 찍는 방법
2. 마스터 테이블을 쿼리후 루프돌며 디테일 테이블을 쿼리하는 방법
대략 이렇게 많이 쓰게됩니다. (뭐 2번째는 거의 안쓰겠죠. ^^)
그런데 이번 작업을 하다보니 왠지 쓸데없는 낭비가 많은것 같아
다른 방법으로 처리해 보았습니다.
아래와 같은 일 대 다 관계의 테이블을 준비합니다.
각각의 테이블에 데이터를 입력해 보죠.
< tb_books >
< tb_subscriber >
이제 조인을 걸어 데이터를 얻어보겠습니다.
물론 여기까지는 원하는 대로(?) 잘 나옵니다.
저것을 레코드셋으로 받아 처리하면 되겠지요.
하지만 자세히 보면 낭비되는 부분들이 있습니다.
마스터 데이터 들이 반복되는 점이죠.
해서~ 이렇게 반복되는 부분을 없앨 방법을 고민하다 찾은 것이 바로
XML을 이용하는 것이었습니다.
XML로 아래와 같이 데이터를 받는다면 반복되는 많은 양이 줄어들며,
XMLDOM을 이용하여 node tracking을 한다면 데이터 처리도 간편할 것이고,
데이터를 DOM에 담는 즉시 데이터 베이스와의 커넥션을 끊으면 될것이기에 이래 저래 이득이라 생각했습니다.
XML로 받는다면 아래와 같이 받아야 할것입니다.
이제XML로 데이터를 어떻게 받아내면 될까요??
for xml 이라는 구문으로 쿼리를 하면 바로 XML 데이터를 받아낼 수 있습니다. 빙고~
for xml 의 옵션으로는 raw 도 있지만 이것은 그냥 레코드형식으로만 출력되므로 패스합니다.SELECTa.idx,a.bookname,a.price,b.name
FROMtb_booksASaINNERJOIN
tb_subscriberASbONa.idx=b.book_idx
ORDERBYa.idx
forxmlauto
for xml auto, elements 옵션을 사용하게되면 모든 컬럼이 element로 바뀌게 됩니다.
사용하는데 문제는 없지만 보기가 좀 어렵군요. ^^
자... SQL에서는 이제 XML로 데이터를 넘겨줄 준비를 완료 하였습니다.
다음은 ASP 단에서 어떻게 처리해야할지 알아보겠습니다.
ASP단에는 일단 쿼리를 위한 ADODB.Command 객체와 결과를 담을 XMLDOM 객체를 준비하여 아래와 같이 코딩합니다.
SetxmlDom=Server.CreateObject("Microsoft.xmldom")
xmlDom.setProperty"SelectionLanguage","XPath"
setcmd=server.createObject("ADODB.Command")
withcmd
.ActiveConnection="Database 커넥션'
.CommandText="여기에는 쿼리를"
.CommandType=adCmdText
.Properties("XMLRoot")="root"
.Properties("OutputStream")=xmlDom
.Execute,,1024
endwith
setcmd=Nothing
이렇게 하면 XMLDOM에 결과가 root라는 root 엘리먼트를 가진 xml 데이터가 로드됩니다.
이제는 단순히 XMLDOM node tracking을 하면서 데이터를 뿌려주면 됩니다.
Setitems=xmlDom.selectNodes("*/a")
foreachiteminitems
WithResponse
.Write""&item.getAttribute("bookname")&"
"
foreachsubscriberinitem.selectNodes("./b")
.Writesubscriber.getAttribute("name")&"
"
next
EndWith
next