C# 动态将表连接到自身的替代方法
对于一些额外的实践,我想创建一个应用程序,它将告诉用户将一个表连接到另一个表的路径。解决方案将基于输入SQL表演示测试的数据 我发现的最好的方法是动态地将表内部连接到它自身,直到我到达它可以连接到我下面演示的表为止。我不知道如何最好地自动化这一点,用户将输入任意两个表,看看是否有任何可能的连接路径,任何建议?使用sp_执行SQL的C/DynamicSQLC# 动态将表连接到自身的替代方法,c#,linq,join,dynamic,C#,Linq,Join,Dynamic,对于一些额外的实践,我想创建一个应用程序,它将告诉用户将一个表连接到另一个表的路径。解决方案将基于输入SQL表演示测试的数据 我发现的最好的方法是动态地将表内部连接到它自身,直到我到达它可以连接到我下面演示的表为止。我不知道如何最好地自动化这一点,用户将输入任意两个表,看看是否有任何可能的连接路径,任何建议?使用sp_执行SQL的C/DynamicSQL CREATE TABLE #Test ( tbl1 varchar(20), tbl2 varchar(20), co
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'
您使用的是什么数据库引擎?如果使用的数据库支持with语句,则可以使用递归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
如果希望从中获得不同的路径,则需要更改查询第二行中的值,以匹配测试表中的不同记录
通过使用multiple WITH语句,您可以做更多的事情,但我不能完全确定您是希望以不同的方式呈现信息,还是希望提供不同的输入。不管是哪种方式,我相信通过使用WITH语句,您可以得到您想要的结果,并且使用它们非常有趣:我使用的是MS SQL Server 2008-您会说这将是SQL Server的公共表表达式吗?是的,我正在查看哪些CTE公共表表达式类似于WITH语句。语法看起来也差不多。