【问题标题】:Recursive lookup needed. DB vs. C# GUI需要递归查找。 DB 与 C# GUI
【发布时间】:2018-04-23 00:36:42
【问题描述】:

我目前有一个程序,我想在网格中列出“支持票”。

票来自票务系统的 SQL 数据库。

一张票有一个活动,例如:

我有一个功能齐全的设计,但无法列出以下内容:

我想在我的程序中做的是列出父票,他们的子票作为子票(详细信息)。但是,由于增加了复杂性,我不得不递归地执行此操作。

例子:

我的问题是:

  • 在这种情况下,是否要在 DB 级别进行递归查找?还是应用层?

  • 我有义务做到这一点,循环遍历每张票的所有票吗?

  • 这些查找对性能有何影响?

我做了一些研究并试图单独获得门票,但没有做到这一点。我使用以下方法在数据库级别上进行了尝试:

SELECT ticketID,
FROM dbo.Ticket
UNION ALL

SELECT a.ticketID, 
FROM dbo.Ticket a 
INNER JOIN dbo.ticket s ON a.ticketID = s.ticketID 

SELECT * FROM Ticket 
where ticketID = 1

当我测试这个时,我想到也许我做错了,因为也许递归搜索最好在我的应用程序级别完成(我只需要做一个简单的@987654327 @ 在我的数据库中。

这是真的吗?我需要在应用程序级别执行此操作吗?

【问题讨论】:

  • 通常表示层框架提供处理分层数据的 ootb 控件。根据您的 RDBMS 版本,您可以考虑使用返回 Xml 或 Json 的查询,但这取决于您的实现。主观上,我建议选择一个平票结果。
  • 不清楚您是要显示数据库中的所有票证,还是只显示属于同一父级的所有票证。如果是最合适的,请在应用程序中进行递归匹配。如果是第二个,recutive cte 可能是更好的选择,因为这样您就可以只选择您实际需要的数据。
  • 我会在应用程序级别上这样做,在我看来更容易阅读。 Ticket 有一个 Ticket 对象的集合
  • 为什么这会被投票赞成关闭?

标签: c# sql database recursion recursive-query


【解决方案1】:

在 SQL Server 中使用递归查询

给定

With TicketTree(tID,  pID)
As
(
    Select ticketID, parentID From Ticket Where ticketID = 1 
    UNION ALL
    Select ticketID, parentID from Ticket Inner join TicketTree R On parentID = R.tID   
)
select * from TicketTree

给予

或者如果您查询根票 4

然后您可以加入您的活动或任何您想做的事情,我只是将它保持在递归查询的最低需求

【讨论】:

  • 如您所见,它们是直接来自 sql management studio 的屏幕截图
  • 谢谢!但是在什么时候我必须更新链接表并选择它的子表?我不会有义务在我的程序中而不是在数据库中这样做吗?这是因为我必须为每一行枚举并且不知道WHERE 子句会有什么。
【解决方案2】:

我不确定这是不是最佳方法,但我会编写一个存储过程,让它简单地获取数据库级别的所有相关票证。我的意思是,您可以轻松地进行存储过程循环,直到它获取特定票证的所有子/父,然后将所有这些记录返回给客户端。

一种可能的方法:

  1. 创建一个包含您要传递的记录的空表 返回
  2. 为“下一个要查找的 ID”创建一个表
  3. 查询您的具体工单
  4. 将结果添加到您的返回表,并将 ID 添加到 Lookfor-ID 表
  5. 虽然“查找”表中仍有结果

    Query the DB for anything that has a child or parent in the Lookfor Table
        (and that isn't already in the return table)
    Add all those records to the return table
    Clear out the "Lookfor" table, and add all those new IDs to it.
    

无论如何,是的,您仍然需要在 C# 端正确组装数据,但您不会使用一堆单独的查询来访问数据库。存储过程将一举获得您感兴趣的所有记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多