2009-07-20 65 views
1

我有一张表可能有数千(可能是几百万?)的记录。它基本上是一个存储特殊日志条目的审计跟踪表。它被称为“日志”。在单个查询中选择主记录及其所有相关的外部详细记录?

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

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

我做在日志表中的SELECT选择发生在一个特定的时间范围内的所有记录,说:“过去30天” 。

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

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

我真的想要避免显而易见的回退解决方案,即首先查询Logs表,然后对每个结果运行附加查询以获取LogsExtended记录。这让我感到非常浪费,并可能导致数千个查询正在运行。

我想我正在做一个这样的小山,但我无法弄清楚。

谢谢。

回答

1

你需要使用一个左连接,否则将无法显示记录来自没有项目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 

这将返回日期之间的所有日志,然后为同一原始日志所有扩展日志设置

1

一对多关系中连接的本质是将“一个”表中的行乘以“many”表的倍数。你可以一起去一个选项是从日志表只占用了LOGID,连同从LogsExtended表中的所有信息休息:

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

虽然这会导致“一个”表字段的重复,但如果需要在单个SQL查询/语句中执行,这可能是最好的方法。 – CraigTP 2009-07-20 10:56:00

+0

因此除了返回大量重复记录之外,没有办法做到这一点? 只要我没有错过这里的一个窍门 - 那很好。 我想现在的问题是,在我的.NET应用程序中将这个“平面二维”数据转换为三维数据的最佳方式是什么?目前,我已经提出了一个即兴解决方案,它将重复条目汇总到一个条目中,同时将“LogsExtended”信息累积到一个集合中。 – nbevans 2009-07-20 11:02:01

相关问题