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

时间:2014-02-27 12:20:52

标签: sql database sql-server-2008 loops subquery

我正面临一个新的SQL数据库场景(对我来说),我真的很感激任何建议。我确信有一个非常简单的答案,但我无法理解它。我会尝试尽可能具体......

客户在我们的数据库中将有许多单独的设备。这些appts可以是一次性的或作为一系列访问链接。我试图找到一个特定的约会事件,并从我的Microsoft SQL数据库2008 R2 DB中找到此事件的所有链接约会。理想情况下,我希望将每个链接的appt视为查询结果中的单独行。

所有Appts详细信息都在表1中(我们称之为“Appt”)。 Appt和 之前的Appt 之间的链接在表2(“ApptLink”)中。 ApptLink表包括作为FK的ApptId和在sperate列中的先前链接的ApptId(FK)。

EG。样本数据

Appt表

ApptId(PK),DateTime,eventtype,duration,comment,apptstatus,location

ApptLink表

PK,ApptId(FK),PreviousApptId(FK)

我会试着用另一种方式。我可以返回主要的appt我正在寻找没有问题,但是当我想找到以前的appt时,我需要加入Apptlink表,它只显示我之前的ApptId,并找到我之前需要的appt在apptlink表及其previousapptid等中找到Id ...我想我需要运行一个Subquery / loop来返回该appt的结果,因为我可能有 30个链接的appts

我开始创建类似下面的东西,但我知道它不对,并且必须比运行30个子查询更简单/更快捷。我觉得我需要创建大量的子查询,以确保我得到所有以前的应用程序,直到我返回一个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...

                 )

非常感谢您的协助。

约什

1 个答案:

答案 0 :(得分:0)

这听起来像是一个递归查询。您可以在此处阅读使用公用表表达式(CTE)在SQL Server中完成的操作:http://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx