将表动态连接到自身的替代方法

时间:2015-04-06 21:21:07

标签: c# linq join dynamic

对于其他一些练习,我想创建一个应用程序,告诉用户将表连接到另一个表时要采取的路径。解决方案将基于输入到SQL表中的数据(演示#Test)。

我找到的最佳路线是动态地将表格连接到自身上,直到我到达它可以加入的表格(我在下面演示)。我不确定如何最好地自动化这个用户输入任何两个表来查看是否有任何可能的连接路径,任何建议? C#/使用sp_execute SQL的动态SQL?

CREATE TABLE #Test
(
    tbl1 varchar(20),
    tbl2 varchar(20),
    col  varchar(20)
)

insert into #Test Values ('A','B','c1')
insert into #Test Values ('A','C','c2')
insert into #Test Values ('A','B','c3')
insert into #Test Values ('B','D','c4')
insert into #Test Values ('D','F','c5')
insert into #Test Values ('F','H','c6')
insert into #Test Values ('C','Z','c7')
insert into #Test Values ('H','I','c8')

select * from #Test

select * 
  from #Test A
       inner join #Test B on a.tbl2 = b.tbl1
       inner join #Test C on b.tbl2 = c.tbl1
       inner join #Test D on c.tbl2 = D.tbl1
       inner join #Test e on d.tbl2 = e.tbl1
 where a.tbl1 = 'A' 

1 个答案:

答案 0 :(得分:0)

您使用的是什么数据库引擎?如果您使用的数据库支持语句,则可以使用递归with语句。

在sqlite3中,这看起来像

WITH RECURSIVE #Test2 (tbl1, tbl2, col) AS (
    VALUES('A', 'B', 'c1')
    UNION ALL
    SELECT #Test.tbl1, #Test.tbl2, #Test.col
    FROM #Test,#Test2 WHERE #Test2.tbl2 = #Test.tbl1)
SELECT *
FROM #Test2;

它应该为您提供从表A到表B到引用的任何其他表的所有路径。

我最终得到的结果是:

A|B|c1
B|D|c4
D|F|c5
F|H|c6
H|I|c8

如果您希望从中获得不同的路径,则需要更改查询第二行中的值以匹配#Test表中的其他记录。

使用多个WITH语句可以做更多事情,但我不完全确定您是希望以不同方式呈现信息还是希望提供不同的输入。无论哪种方式,我相信你可以通过使用WITH语句得到你想要的东西并且玩它们非常有趣:)