需要重复查找。 DB vs C#GUI

时间:2017-11-09 21:15:17

标签: c# sql database recursion recursive-query

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

门票来自票务系统中的SQL DB。

票证有一项活动,例如:

enter image description here

我有一个功能齐全的设计但是列出以下内容有问题:

我想在我的计划中做的是列出父票,将子票作为子票(详情)。然而,随着复杂性的增加,我不得不递归地做到这一点。

示例:

enter image description here

我的问题是:

  • 在这种情况下,是否在数据库级别进行递归查找?还是申请级别?

  • AM我有责任实现这一目标,遍历所有门票PER TICKET?

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

我做了一些研究,并试图单独购买门票但尚未实现这一目标。我在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

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

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

2 个答案:

答案 0 :(得分:2)

在SQL Server中使用递归查询

给出

enter image description here

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

给出

enter image description here

或者如果您查询根票证4

enter image description here

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

答案 1 :(得分:-1)

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

这样做的可能方法:

  1. 创建一个包含您要传递的记录的空表 回
  2. 为" ID创建一个表格以寻找下一个"
  3. 查询您的特定故障单
  4. 将结果添加到返回表,并将ID添加到Lookfor-ID 表
  5. 虽然仍然有" Lookfor"表

    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.
    
  6. 无论如何,是的,您仍然必须在C#端正确地汇编数据,但是您不会通过一堆单独的查询来访问数据库。存储过程可以一举获得您感兴趣的所有记录。