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

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 - 以前从未遇到过这个问题,但我认为它会帮助我!如果其他人在同一条船上,将尝试回发我的解决方案。

以上是关于返回链接记录并避免多个子查询/循环的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB 循环子字符串

H3 BPM循环子表相关方法介绍

新建一直循环子线程,怎样关闭循环子线程,contains a path separator

在 Oracle 中避免相关子查询

php foreach为啥比for效率高

SQL问题,子查询返回的值不止一个!