返回链接记录并避免多个子查询/循环
Posted
技术标签:
【中文标题】返回链接记录并避免多个子查询/循环【英文标题】:Returning linked records and avoiding multiple subqueries/loops 【发布时间】: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...
)
非常感谢您的帮助。
乔什。
【问题讨论】:
【参考方案1】:这听起来像是一个递归查询。您可以在此处阅读使用公用表表达式 (CTE) 在 SQL Server 中如何完成此操作:http://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx
【讨论】:
感谢 Ownen - 以前从未遇到过这个问题,但我认为它会帮助我!如果其他人在同一条船上,将尝试回发我的解决方案。以上是关于返回链接记录并避免多个子查询/循环的主要内容,如果未能解决你的问题,请参考以下文章