2014-04-22 2 views
0

한 행을 여러 행으로 분할하는 방법이 있습니까?SQLite "split"행을 여러 행으로 변환

패턴 :

patternID | sourceStationID | targetStationID 
1|1|2 
2|1|6 
3|1|3 
4|1|4 
5|4|6 
6|5|6 

I

내 문제는 내가 patternID 가장자리와 sourceStationID 및 targetStationID 가장자리가 연결 식별자이다의 ID입니다 가장자리의 테이블을 가지고있다 허브 전송 테이블도 있습니다.

허브 :

hubID 
4 
5 

하나의 허브를 통해 정확하게 스테이션 1 -> 6을 연결하는 데이터 패턴 ID에서 벗어나야합니다. 그래서 쿼리의 결과는 다음과 같아야합니다

4 
5 
나는 패턴 테이블 다시 허브 테이블과 패턴 테이블에 합류에 의해 그래서 난 얻을했다

:

patternID | sourceStationID | targetStationID | patternID | sourceStationID | targetStationID 
4   | 1    | 4    | 5   | 4    | 6 

할 수있는 I 두에이 행을 분할하는 방법 행?

편집 : 여기 내가 지금까지 사용하는 코드입니다 :

select t2a.patternID from 
(
select * from `patterns` 
join `hubs` on `targetStationID` = `hubID` 
where `sourceStationID` = 1 
) as t1a 
join 
(
select * from `patterns` 
join `hubs` on `sourceStationID` = `hubID` 
where `targetStationID` = 6 
) as t2a 
on t1a.hubID = t2a.hubID 
union 
select t1b.patternID from 
(
select * from `patterns` 
join `hubs` on `targetStationID` = `hubID` 
where `sourceStationID` = 1 
) as t1b 
join 
(
select * from `patterns` 
join `hubs` on `sourceStationID` = `hubID` 
where `targetStationID` = 6 
) as t2b 
on t1b.hubID = t2b.hubID; 

그것은 일하고 있지만이 같은 두 번 눌러 사용하고 있습니다.

+0

작동하지 않습니다 수 검색어를 게시하여 선택한 항목을 확인하면 제안 된 변경 사항을 제안 할 수 있습니다. –

+0

당신이 찾고있는 것은 재귀 문장에 대한 WITH 절입니다. 가까운 예 : http://social.msdn.microsoft.com/Forums/sqlserver/en-US/cd37dd9f-17c5-4df5-b072-5a9e51d1798d/show-all-children-and-grandchildren-for-parent-hierarchically ? forum = transactsql – user2346536

+0

결과가 4와 6 인 이유는 무엇입니까? 4, 5일까요? 당신이 패턴이라고 말 했잖아요. – Frazz

답변

0

원하면 내 답변을 업데이트하면됩니다. 당신의 질문을 이해하는 한, 이것은 당신이 요구 한 것을주는 것 같습니다. 그 대신 CTE에서 수행 조인과 뷰는 피할 수 :

C:\Users\DDevienne>sqlite3 
SQLite version 3.8.4.3 2014-04-03 16:53:12 
Enter ".help" for usage hints. 
Connected to a transient in-memory database. 
Use ".open FILENAME" to reopen on a persistent database. 
sqlite> create table edges (id integer primary key autoincrement, beg int, end int); 
sqlite> insert into edges (beg, end) values (1, 2), (1, 6), (1, 3), (1, 4), (4, 6), (5, 6); 
sqlite> create view edges2 as 
    ...> select start.id as beg_id, start.beg as beg, start.end as hub, finish.id as end_id, finish.end as end 
    ...> from edges start, edges finish 
    ...> where start.end = finish.beg; 
sqlite> .headers on 
sqlite> select * from edges2; 
beg_id|beg|hub|end_id|end 
4|1|4|5|6 
sqlite> create table hubs (id integer primary key); 
sqlite> insert into hubs values (4), (5); 
sqlite> with hub_edges(beg_id, beg, hub, end_id, end) as (
    ...> select edges2.* from edges2, hubs where edges2.hub = hubs.id 
    ...>) 
    ...> select beg_id as id, beg, hub as end from hub_edges 
    ...> union all 
    ...> select end_id as id, hub as beg, end from hub_edges; 
id|beg|end 
4|1|4 
5|4|6 
sqlite> 

경고 :이 최신 SQLite는 (3.8.4.3)를 필요로하고, 3.8.3.x

+0

다른 테이블에서 patternID를 외래 키로 사용하기 때문에 설명 된대로 데이터를 구조화하는 것이 중요합니다. – Mishak