2014-01-14 21 views
0

我下表在SQL:河网查询

RiverID | RiverName  | RecipientID 
------------------------------------ 
0  | Atlantic Ocean | NULL 
1  | Mississippi | 0 
2  | Missouri  | 1 
3  | Yellowstone | 2 
4  | Bighorn  | 3 
5  | Wind   | 3 

RecipientID我的表中的意思是:如果它是NULL,则表行表示海洋或闭合流域。如果RecipientID不为NULL,那么它就是一条河流,它将下游的另一条河流连接起来。

现在我想提出一个问题:给定一条河流,找到下游的所有河流,直到你到达海洋。例如:给定河“风”(RiverID = 5)查询结果将显示:

Wind - Yellowstone - Missouri - Mississippi - Atlantic Ocean. 

我怎样写在SQL这个查询?

+0

序列中河流的最大数量是多少?你使用的是什么数据库? –

+0

它是否必须是纯SQL?你可以使用TSQL/PLSQL(取决于哪个数据库,正如Gordon所问)?如果你可以使用额外的编程语言,它可能会使问题变得更容易。 – CompuChip

+0

说实话,我会在这里使用'CURSOR',因为你不知道你需要多少次迭代。在我看来,它也会更具可读性。 – XN16

回答

1

并非所有SQL数据库都支持分层查询。而当他们这样做时,语法通常是不同的。

如果你的系统连接的最大数目,那么你可以做你想做什么联接:

select r.RiverName, r1.RiverName, r2.RiverName, r3.RiverName, r4.RiverName, r5.RiverName 
from rivers r left outer join 
    rivers r1 
    on r.RecipientId = r1.RiverId left outer join 
    rivers r2 
    on r1.RecipientId = r2.RiverId left outer join 
    rivers r3 
    on r2.RecipientId = r3.RiverId left outer join 
    rivers r4 
    on r3.RecipientId = r4.RiverId left outer join 
    rivers r5 
    on r4.RecipientId = r5.RiverId ; 

这使得名字在五个单独的列。您可以将它们连接在一起以将它们放在一个列中。

+0

系统中链接的最大数量目前为10,但可能会随着新数据的增加而增加添加到数据库中。但我并不指望从任何河流开始到海洋将会有超过20个链接。使用的平台是Microsoft SQLSERVER 2008。 – jirikadlec2