在单个查询中选择主记录及其所有相关的外部详细记录?

时间:2009-07-20 10:46:34

标签: .net sql ado.net

我有一张表可能有数千(数百万?)的记录。它基本上是一个存储特殊日志条目的审计跟踪表。它被称为“日志”。

还有一个名为“LogsExtended”的相关表,它为“日志”表中的每个条目存储零个或多个附加记录。

有一个外键关系设置,完成删除级联等。

我正在Logs表上执行SELECT以选择在特定时间范围内发生的所有记录,例如“过去30天”。

但是我想以某种方式同时在LogsExtended表中选择相关的外部记录。目的是将此查询的结果填充到具有正确DataRelation设置的DataSet中。

我尝试过使用各种JOIN子句但这些都会导致错误的行为 - 对于LogsExtended表中的每个相关记录,Logs中的条目会重复出现。

我真的想避免显而易见的回退解决方案,即首先查询Logs表,然后,对于每个结果,运行一个额外的查询以获取LogsExtended记录。这让我觉得非常浪费,可能导致数以千计的查询被运行。

我认为我正在制造一个小山丘,但我无法弄明白。

感谢。

2 个答案:

答案 0 :(得分:1)

加入一对多关系的本质是将“一”表中的行乘以“多”表的次数。您可以使用的一个选项是仅从Logs表中获取LogID以及LogsExtended表中的所有其他信息:

SELECT L.ID, E.*
FROM Logs L, LogsExtended E
WHERE 
L.ID = E.ID
AND
(Some date limitation on the Logs table)

答案 1 :(得分:1)

您需要使用左连接,否则它不会显示没有项目LogExtended的日志中的记录。就这样

DECLARE @StartDate DATETIME,
        @EndDate DATETIME

SELECT  @StartDate = '01 Jun 2009',
        @EndDate = '30 Jun 2009'

SELECT  *
FROM    Logs l LEFT JOIN
        LogsExtended le ON l.LogID = le.LogID
WHERE   l.Date BEYWEEN @StartDate AND @EndDate

如果您想要2个结果集,则需要以

执行查询
DECLARE @StartDate DATETIME,
        @EndDate DATETIME

SELECT  @StartDate = '01 Jun 2009',
        @EndDate = '30 Jun 2009'

SELECT  l.*
FROM    Logs l 
WHERE   l.Date BEYWEEN @StartDate AND @EndDate

SELECT  le.*
FROM    Logs l INNER JOIN
        LogsExtended le ON l.LogID = le.LogID
WHERE   l.Date BEYWEEN @StartDate AND @EndDate

这将返回日期之间的所有日志,然后返回相同原始日志集的所有扩展日志