返回链接记录并避免多个子查询/循环
我正面临一个新的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
感谢Ownen - 从来没有碰到过这之前,但我认为这将帮助我!如果有其他人在同一条船上,我会尽力回复我的解决方案。 – user3360150