我有一张桌子,可能有数千人(也许是数百万人?)记录的数量。它基本上是一个审计跟踪表,存储特殊的日志条目。它被称为“日志”。
还有一个名为"LogsExtended“的相关表,它为日志表中的每个条目存储零个或多个附加记录。
有一个外键关系设置,包括删除级联等。
我正在对Logs表执行SELECT操作,以选择特定时间范围内发生的所有记录,比如“最近30天”。
但是,我想以某种方式同时选择LogsExtended表中的相关外来记录。目的是将此查询的结果填充到具有正确DataRelation设置的DataSet中。
我尝试过使用各种JOIN子句,但它们都可能导致错误的行为--日志中的条目对于LogsExtended表中的每个相关记录都是重复的。
我真的希望避免明显的后备解决方案,即首先查询日志表,然后为每个结果运行一个额外的查询,以获得LogsExtended记录。这让我觉得非常浪费,可能会导致运行数千个查询。
我想我有点小题大做了,但我就是搞不明白。
谢谢。
发布于 2009-07-20 11:01:36
您需要使用左连接,否则它将不会显示日志中没有int 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这将返回日期之间的所有日志,然后返回同一原始日志集的所有扩展日志
发布于 2009-07-20 10:52:15
在一对多关系中,join的本质是将“一”表中的行乘以与“多”表中的行的倍数。您可以使用的一种方法是只获取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)https://stackoverflow.com/questions/1152843
复制相似问题