2012-11-02 2 views
0

예를 들어 서로 연결된 두 개의 열, 즉 ID1과 ID2가 있습니다. ID가 테이블의 다른 ID와 링크 될 수 있습니다.DB2에 데이터를 링크하기 위해이 SQL을 작성하는 방법은 무엇입니까?

ID1   ID2 
------------------ 
001   002 
001   003 
004   005 
002   006 
005   007 

상기 표에서, 001, 002, 003, 006은 연결되어 있고, 004, 005, 007은 연결되어있다.

DB2 용 SQL에서이 정보를 쿼리 할 수 ​​있습니까?

포맷은 다음과 같이 유사하다 : 한편

Group  ID 
-------------- 
1   001 
1   002 
1   003 
1   006 
2   004 
2   005 
2   007 

하나 개 이상의 레코드 (008, 007)는 테이블

ID1   ID2 
------------------ 
001   002 
001   003 
004   005 
002   006 
005   007 
008   007 (Newly added) 

에 첨가되는 경우 예상되는 결과가 될 것 004, 005, 007, 008이 연결되어 있기 때문에 :

Group  ID 
-------------- 
1   001 
1   002 
1   003 
1   006 
2   004 
2   005 
2   007 
2   008 

이기 때문에.

DB2 버전은 9.7입니다.

+0

당신은 훨씬 더 어렵게 만들었습니다 (단일 루트에서 더 쉬울 것입니다). 당신은 어떤 종류의 네트워크 그래프를 원한다. (몇몇 다른 DBMS는 이것을 더 잘 지원한다.) 네가 루크에 있다고 가정하는거야? 아, 링크에서 루프를 만들 수 있습니까? –

+0

예. 그것은 LUW에 있고 아무런 루프도 없을 것입니다 (예 : 같은 시간에 표에 001-002 및 002-001). – red23jordan

+0

샘플 데이터의 예상 입출력을 편집 할 수 있습니까? 그리고 저는 여전히 생각하고 있습니다. 그러나 이것은 더 어려워요. –

답변

2

물론 가능합니다. 그것은 재귀 쿼리가 필요합니다

WITH Recur (grp, root, leaf) as (SELECT ROW_NUMBER() OVER(ORDER BY root.id1), 
             CAST(NULL as CHAR(3)), 
             root.id1 
           FROM Linked as root 
           EXCEPTION JOIN Linked as leaf 
           ON leaf.id2 = root.id1 
           GROUP BY root.id1 
           UNION ALL 
           SELECT grp, leaf, id2 
           FROM Recur 
           JOIN Linked 
           ON id1 = leaf) 

SELECT grp, leaf 
FROM Recur 
ORDER BY grp, leaf 

이 (내 로컬 iSeries에서 테스트를하고, SQL 서버에서 작동하도록 LEFT JOIN 스타일의 예외를 사용하는있는 SQL Fiddle example 작업 한)

가 예상되는 출력을 산출 :

grp leaf 
============= 
1  001 
1  002 
1  003 
1  006 
2  004 
2  005 
2  007 
+0

아이디어를 가져 주셔서 감사하지만 다음과 같은 오류가 발생했습니다 : SQL0345N 재귀 공통 테이블 표현식 "Recur"의 fullselect는 두 개 이상의 fullselect의 UNION이어야하며 열 함수, GROUP BY 절, HAVING 절, ​​ORDER를 포함 할 수 없습니다 BY 절 또는 ON 절을 포함하는 명시 적 조인. – red23jordan

+0

SQL을 "SELECT grp, leaf, id2 FROM Recur JOIN을 id1 = leaf에 연결"에서 "SELECT grp, leaf, id2 FROM Recur, id1 = leaf 위치로 링크"로 수정하여 SQL을 지금 실행할 수있었습니다. – red23jordan

+0

이 SQL은 위의 예제에서 잘 작동합니다. 그러나 하나의 레코드를 추가 할 때 - "001, 007"테이블에. 001, 002, 003, 004, 005, 006, 007이 연결되어 있지만 여전히 2 개의 그룹이있을 것으로 예상됩니다. 자세한 내용은 링크를 참조하십시오. http://www.sqlfiddle.com/#!3/faf98/1 – red23jordan

관련 문제