返回链接的记录并避免多个子查询/循环



我面临着一个新的SQL数据库场景(对我来说),如果有任何建议,我将不胜感激。我相信有一个非常简单的答案,但我无法完全理解。我会尽可能具体。。。

客户将在我们的数据库中有许多独立的应用程序。这些应用程序可以是一次性的,也可以链接为一系列访问。我正在尝试从我的Microsoft SQL数据库2008 R2数据库中查找特定的约会事件,并查找与该事件相关的所有约会。理想情况下,我希望在查询结果中将每个链接的应用程序视为一个单独的行。

所有Appt的详细信息都在表1中(让我们称之为"Appt")。Appt和其前一个仅应用程序之间的链接如表2所示("ApptLink")。ApptLink表包括作为FK的ApptId和sperate列中先前链接的ApptId(FK)。

例如。样本数据

应用程序表

应用程序ID(PK)、日期时间、事件类型、持续时间、注释、应用程序状态、位置

ApptLink表

PK,应用程序ID(FK),上一个应用程序ID

我试着换一种说法。我可以毫无问题地返回我正在查找的主应用程序,但当我想找到以前的应用程序时,我需要加入Apptlink表,该表将只显示以前的ApptId,要找到上一个应用程序,我需要在apptlink表中找到该Id及其上一个apptid等等……我想我需要运行一个Subquery/循环来返回该应用程序的结果,因为我可能有30个链接的应用程序

我开始创建下面这样的东西,但我知道这是不对的,必须有一种比运行30个子查询更简单/更快的方法。我觉得我需要创建大量的子查询,以确保我得到所有的previousapptId,直到我返回null,这意味着没有更多链接的previous apptId。

Select *
From Appt 
Where ApptId in (Select Appt.ApptId, ApptLink.PreviousApptId
From Appt 
LEFT OUTER JOIN ApptLink ON Appt.ApptId=ApptLink.ApptId
Where Appt.Apptevent = 'Finish' and Appt.DateTime = '2014-3-1'
UNOIN
Select ApptLink2.PreviousApptId
From AppLink ApptLink2
Where ApptLink2.ApptId = ApptLink.PreviousApptId --(from above?)
UNOIN
Select ApptLink3.PreviousApptId
From AppLink ApptLink3
Where ApptLink3.ApptId = ApptLink2.PreviousApptId --(from above?)
--and so on for 30+ times...
)

非常感谢您的帮助。

乔希。

这听起来像是一个递归查询。您可以在这里阅读在SQL Server中使用公共表表达式(CTE)是如何做到这一点的:http://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

最新更新