我正面临一个新的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...
)
非常感谢您的协助。
约什
答案 0 :(得分:0)
这听起来像是一个递归查询。您可以在此处阅读使用公用表表达式(CTE)在SQL Server中完成的操作:http://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx