我有一张表可能有数千(数百万?)的记录。它基本上是一个存储特殊日志条目的审计跟踪表。它被称为“日志”。
还有一个名为“LogsExtended”的相关表,它为“日志”表中的每个条目存储零个或多个附加记录。
有一个外键关系设置,完成删除级联等。
我正在Logs表上执行SELECT以选择在特定时间范围内发生的所有记录,例如“过去30天”。
但是我想以某种方式同时在LogsExtended表中选择相关的外部记录。目的是将此查询的结果填充到具有正确DataRelation设置的DataSet中。
我尝试过使用各种JOIN子句但这些都会导致错误的行为 - 对于LogsExtended表中的每个相关记录,Logs中的条目会重复出现。
我真的想避免显而易见的回退解决方案,即首先查询Logs表,然后,对于每个结果,运行一个额外的查询以获取LogsExtended记录。这让我觉得非常浪费,可能导致数以千计的查询被运行。
我认为我正在制造一个小山丘,但我无法弄明白。
感谢。
答案 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
这将返回日期之间的所有日志,然后返回相同原始日志集的所有扩展日志