我目前有一个程序,我想在其中列出支持门票'在网格中。
门票来自票务系统中的SQL DB。
票证有一项活动,例如:
我有一个功能齐全的设计但是列出以下内容有问题:
我想在我的计划中做的是列出父票,将子票作为子票(详情)。然而,随着复杂性的增加,我不得不递归地做到这一点。
示例:
我的问题是:
在这种情况下,是否在数据库级别进行递归查找?还是申请级别?
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
。
这是真的吗?我是否需要在应用程序级别执行此操作?
答案 0 :(得分:2)
在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
然后,您可以加入您的活动或任何您想要做的事情,我只是将其保持为递归查询的最低需求
答案 1 :(得分:-1)
我不确定它是最佳方法,但我编写了一个存储过程并让它只是在数据库级别获取所有相关的票证。我的意思是,您可以轻松地进行存储过程循环,直到它获得特定故障单的所有子项/父项,并将所有这些记录返回给客户端。
这样做的可能方法:
虽然仍然有" 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.
无论如何,是的,您仍然必须在C#端正确地汇编数据,但是您不会通过一堆单独的查询来访问数据库。存储过程可以一举获得您感兴趣的所有记录。