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

问题描述:

我正面临一个新的SQL数据库场景(对于我),我真的很感激任何建议。我确信有一个非常简单的答案,但我不能完全理解它。我会尝试,并尽可能具体...返回链接记录并避免多个子查询/循环

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

所有Appts细节参见表1(可以称之为“聘任”)。 的APPT和其先前APPT之间的联系仅示于表2( “ApptLink”)。 ApptLink表包含ApptId作为FK和先前链接的ApptId(FK)。

例如,样本数据

APPT表

ApptId(PK),日期时间,事件类型,持续时间,评论,apptstatus,位置

ApptLink表

PK,ApptId(FK),PreviousApptId(FK)

我会尝试换一种方式。我可以返回我没有遇到任何问题的主要应用程序,但是当我想要查找以前的应用程序时,我需要加入Apptlink表,该表仅向我显示以前的ApptId,并查找以前需要的应用程序发现标识在apptlink表及其previousapptid等等......我想我需要运行一个子查询/循环来返回聘任的结果,因为我可能有30联appts

我开始创建类似下面,但我知道它不是正确的,并且必须有比运行30次的查询更简单/更快的方法。我觉得我需要创建大量的子查询来确保我得到所有的previousapptIds,直到我返回null,这意味着没有更多的链接的previousapptIds。

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

+0

感谢Ownen - 从来没有碰到过这之前,但我认为这将帮助我!如果有其他人在同一条船上,我会尽力回复我的解决方案。 – user3360150