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 6283 게시물 읽기
No. 6283
쿼리질문 하나 드립니다.(미치기 일보직전...)
작성자
김영남(kkimyn)
작성일
2011-12-08 18:34
조회수
7,473

아래와 같은 테이블이 있습니다.

new old => tbl


-----------------------------


1 X W


2 Y X


3 Z Y ---------- 구분


4 B A


5 C B


6 D C


7 E D


----------------------------


위와 같은 테이블이 있습니다.



old 는 이전 갑이고 new 새로운 값입니다.



신규로 데이타가 들어가면 올드값에 이전 자료가 들어갑니다.



들어가는거는 상관없는데..



조회하고 싶은 것은




select new from tble where new='E'



이런식으로 조회하면 원하는 데이타는 연결 연결되서 관계 되는 모든 레코드를 출력하고 싶은데



희망 결과값



new


--------------------------


1 B


2 C


3 D


4 E


----------------------------




이런 형식인데... 이걸 한방 쿼리로 해결하는 방법이 없을까해서요..



요리조리 머리를 굴려 봣는데도.. 마땅한 대한이 안나오네요..



고수님들의 조언 부탁 드립니다.

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

old랑 new랑 같은거끼리 다시 연결 연결 된다는 건가요?

값이 어떻식으로 들어가는지에 따라서 좀 응용이 필요할수도 있습니다.

재귀쿼리를 사용했기때문에

혹시 성능상에 민감하시면 충분히 테스트를 해보셔야됩니다.

데이터가 이미 있으시니 TBL2부터 하시면 됩니다.

DECLARE @Input VARCHAR(10)

-- 찾을 NEW

SET @Input = 'E'

 

;

WITH TBL AS

(

       -- 데이터 테이블

       SELECT 'X' AS NEW, 'W' AS OLD UNION ALL

       SELECT 'Y' AS NEW, 'X' AS OLD UNION ALL

       SELECT 'Z' AS NEW, 'Y' AS OLD UNION ALL

       SELECT 'B' AS NEW, 'A' AS OLD UNION ALL

       SELECT 'C' AS NEW, 'B' AS OLD UNION ALL

       SELECT 'D' AS NEW, 'C' AS OLD UNION ALL

       SELECT 'E' AS NEW, 'D' AS OLD

)

, TBL2 AS

(

       -- 재귀 쿼리

       SELECT NEW, OLD

       FROM TBL

       WHERE NEW = @InPut

       UNION ALL

       SELECT A.NEW, A.OLD

       FROM TBL AS A

       JOIN TBL2 AS B

       ON A.NEW = B.OLD

)

 

SELECT NEW

FROM TBL2

ORDER BY NEW

-- 정렬을 안하면 E부터 찾아서 연관된 순서대로 나와서 역순이되므로 다시 정렬

 

향지(jumdol625)님이 2011-12-09 10:09에 작성한 댓글입니다.

죄송한 말씀인데..

이문장이 sql 2000 에서도 상관없이 돌아가는 건가요..

WITH TBL AS(   <===

여기서 자꾸 에러가 나는데요...TT

김영남(kkimyn)님이 2011-12-09 11:19에 작성한 댓글입니다.

2000이시면 이방법으로는 안되실것 같아요 ㅠㅠ

향지(jumdol625)님이 2011-12-09 12:21에 작성한 댓글입니다.

 2000 이라면 

create table tbl
( newCode nchar(1)
, oldCode nchar(1)
)
;

 

--향지님 아녔음 이거 다 어떻게 넣을뻔 했.. ㅋㅋ ㄳㄳ

insert into tbl( newCode , oldCode )
SELECT 'X' AS NEW, 'W' AS OLD UNION ALL
SELECT 'Y' AS NEW, 'X' AS OLD UNION ALL
SELECT 'Z' AS NEW, 'Y' AS OLD UNION ALL
SELECT 'B' AS NEW, 'A' AS OLD UNION ALL
SELECT 'C' AS NEW, 'B' AS OLD UNION ALL
SELECT 'D' AS NEW, 'C' AS OLD UNION ALL
SELECT 'E' AS NEW, 'D' AS OLD
;

 

 

declare @rc int;

declare @oc nchar(1);

declare @curCode nchar(1);

set @curCode = N'E';

 

create table #aa(

selCode nchar(1)

);

 

/* select 안될때까지 대차게 돌아보능겨~~ */

while 1=1
begin
select @oc = oldCode from tbl where newCode = @curCode ;
set @rc = @@ROWCOUNT;
-- 가져와서 없으면
if 0 = @rc 
begin
break;
end
-- 가져와서 있으면
else
begin
-- 이게 없으면 코드에서 loop 있을때 {예) new a old a} while이 무한 loop 걸림
if exists ( select * from #aa where selCode = @curCode )
begin
break;
end
else
begin
insert into #aa ( selCode ) values( @curCode );
set @curCode = @oc;
end
end
end

select * from #aa;

 

이렇게 하믄 되잖을까요?

 

우욱님이 2011-12-09 17:30에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6288테이블 정보 보기 [1]
초보
2011-12-12
6818
6285ms sql 을 mysql 로 이관 하려고 합니다... 여러가지 좀 알려주세요ㅠ.ㅜ
박순채
2011-12-11
6807
6284SQL문 소숫점!! [2]
kongsu
2011-12-10
6886
6283쿼리질문 하나 드립니다.(미치기 일보직전...) [4]
김영남
2011-12-08
7473
6282SSIS문의~ [1]
2011-12-08
6265
6280쿼리문 좀 도와주십시오. ㅠㅠ 제발~~ [2]
초보입니다
2011-11-29
7124
6279쿼리좀 부탁드립니다. [1]
돈세자
2011-11-29
6900
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다