【发布时间】:2014-02-27 12:20:52
【问题描述】:
我正面临一个新的 SQL 数据库场景(对我而言),我非常感谢任何建议。我确信有一个非常简单的答案,但我无法完全理解它。我会尽量做到具体一点……
客户将在我们的数据库中有许多单独的应用程序。这些应用程序可以是一次性的,也可以作为一系列访问链接。我正在尝试从我的 Microsoft SQL 数据库 2008 R2 DB 中查找特定的约会事件并找到与该事件相关的所有约会。理想情况下,我希望将每个链接的 appt 视为查询结果中的单独行。
所有 Appts 的详细信息都在表 1 中(我们称之为“Appt”)。 Appt 与仅限其以前的 Appt 之间的链接在表 2 中(“ApptLink”)。 ApptLink 表包括作为 FK 的 ApptId 和单独列中的先前链接的 ApptId (FK)。
例如。样本数据
申请表
ApptId (PK)、DateTime、事件类型、持续时间、评论、apptstatus、位置
ApptLink 表
PK、ApptId (FK)、PreviousApptId (FK)
我会尝试换一种说法。我可以返回我正在寻找的主应用程序没有问题,但是当我想找到以前的应用程序时,我需要加入 Apptlink 表,该表将只显示以前的 ApptId,并找到我需要的以前的应用程序在 apptlink 表中找到该 Id 及其previousapptid 等等...我想我需要运行一个子查询/循环来返回该应用程序的结果,因为我可能有 30 个链接的应用程序 。
我开始创建类似下面的内容,但我知道它不正确,必须有比运行 30 个子查询更简单/更快的方法。我觉得我需要创建大量子查询以确保获得所有 previousapptId,直到我返回 null,这意味着没有更多链接的 previousapptId。
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 database sql-server-2008 loops subquery