我面临着一个新的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...
)
非常感谢您的帮助。
乔希。