【问题标题】:Alternatives to dynamically joining a table onto itself将表动态连接到自身的替代方法
【发布时间】:2015-04-06 21:21:06
【问题描述】:

对于一些额外的实践,我想创建一个应用程序,它会告诉用户为了将一个表连接到另一个表而采取的路线。该解决方案将基于 SQL 表中的数据输入(演示#Test)。

我发现的最佳途径是动态地将表格内部连接到自身上,直到我到达它可以连接的表格(我在下面演示的内容)。我不确定如何最好地自动执行此操作,用户将输入任意两个表以查看是否有任何可能的连接路径,有什么建议吗?使用 sp_execute SQL 的 C#/动态 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' 

【问题讨论】:

    标签: c# linq join dynamic


    【解决方案1】:

    您使用的是什么数据库引擎?如果您使用的数据库支持 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
    

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

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

    【讨论】:

    • 我使用的是 MS SQL Server 2008 - 你会说这是 SQL Server 的公用表表达式吗?
    • 是的,我正在查看link,它看起来像 CTE(公用表表达式)类似于 WITH 语句。语法看起来也差不多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多