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
운영게시판
최근게시물
MySQL Q&A 27603 게시물 읽기
No. 27603
이런 것도 능한가요? ㅠㅠ (조인 or 서브쿼리?)
작성자
졸던아이
작성일
2008-06-16 09:13ⓒ
2008-06-16 09:15ⓜ
조회수
3,924

sql은 초보인데요. db를 연동해서 프로그래밍을 하다가 혹시 아래와 같은 sql문이 가능한지 너무 궁금해서 고수님들의 조언을 구합니다.

가설) 테이블 A, 테이블 B, 결과 테이블 C

테이블 A 

ida  | title | author

 1       aa      me

 2       bb      you


테이블 B

idb | filetype | filename | ida

a1      mp3         song       1
a2      avi           movie     1
a3      mp3         song2     2



join 된 결과

테이블 C

ida | title | author | mp3 | avi |

1       aa       me      o        o
2       bb       you     o        x

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

테이블B에 반드시 1회 이상 존재한다고 가정하면

기본 쿼리는 아래와 같은 format이 되겠군요.

SELECT ta.ida, ta.title, ta.author, tb.filetype
FROM tableA AS ta INNER JOIN tableB AS tb ON ta.ida = tb.ida
GROUP BY ta.ida, ta.title, ta.author, tb.filetype

위의 결과에서 filetype행을 열로 바꿔주고 존재 여부에 따라 o 또는 x가 출력되도록 하면 되므로

SELECT tmp.ida, tmp.title, tmp.author, 
CASE fn WHEN 'mp3' THEN 'o' ELSE 'x' END AS mp3,
CASE fn WHEN 'avi' THEN 'o' ELSE 'x' END AS avi
FROM
(
 SELECT ta.ida, ta.title, ta.author, tb.filetype
 FROM tableA AS ta INNER JOIN tableB AS tb ON ta.ida = tb.ida
 GROUP BY ta.ida, ta.title, ta.author, tb.filetype
) AS tmp

와 같이 하면 행을 열로 고치는 작업은 완료가 됩니다.( 참조: http://blog.naver.com/uook_/130031508980 )
중복된 ida에 대해서 합치는 작업은 당연히 group by로 수행합니다.

SELECT tmp2.ida, tmp2.title, tmp2.author, 
MIN( mp3 ) AS mp3,
MIN( avi ) AS avi
FROM
(
SELECT tmp.ida, tmp.title, tmp.author, 
CASE fn WHEN 'mp3' THEN 'o' ELSE 'x' END AS mp3,
CASE fn WHEN 'avi' THEN 'o' ELSE 'x' END AS avi
FROM
(
 SELECT ta.ida, ta.title, ta.author, tb.filetype
 FROM tableA AS ta INNER JOIN tableB AS tb ON ta.ida = tb.ida
 GROUP BY ta.ida, ta.title, ta.author, tb.filetype
) AS tmp
) AS tmp2
GROUP BY tmp2.ida, tmp2.title, tmp2.author

처음 가정한 테이블B에 테이블A의 ida값이 0개일 수도 있는 경우에는 기본 쿼리가 LEFT JOIN으로 묶이는 것부터 비슷하게 따라하시면 만드실 수 있을 겁니다.

그리고 tableB의 filetype이 별도의 table로 구성되어 있다면 중간의 CASE문은 mysql 외부(perl, php 등)에서 상당히 light하게 생성이 가능합니다. 그렇지 않다면 distinct로 tableB를 full scan해야 하는 불상사가.. --_--;;

우욱님이 2008-06-16 12:38에 작성한 댓글입니다.
이 댓글은 2008-06-16 12:43에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
27609table select 할 때 각 필드값 비교하여 값 가져오기. 도와주세요..T^T
mysqli?
2008-06-18
3333
27608쿼리문 질문좀 드릴께요. [1]
오용규
2008-06-18
3223
27607쿼리 최적화좀 도와주세요..[해결완료] [2]
VQ
2008-06-18
3651
27603이런 것도 능한가요? ㅠㅠ (조인 or 서브쿼리?) [1]
졸던아이
2008-06-16
3924
27602erd 사용 중 외래키 사용법 [3]
강원철
2008-06-15
4584
27601root
ㅓㅓㅓㅓ
2008-06-15
3187
27600MySQLㄷㄷㄷ
JW
2008-06-15
3532
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다