时间:2016-03-08 18:02:24

标签: sql database-performance

我有一个有4列的表

PKID,OutMailID,JobMailingDate,InsertDatetime 这是将数据插入表中的方式 PKID是表的主键 对于带有JObMailingDate的单个outMailID,表中存在avg 3记录 不同的插入日期时间。该表有数百万条记录

我有许多其他表具有相同的数据,但这些表属于不同的类别

现在我想找出答案 1)查找所有OutMailID,其中InsertDatetime位于参数数据范围之间 2)一旦我有OutMailID列表,我想找到所有这些OutMailID的最小InsertDatetime,其中此最小日期介于Param 1和Param2之间

表的数据是这样的

Select 1 as PKID,1 as OutMailID,'2010/01/01' as JobMailingDate,'2010/01/01' as InsertDatetime 
UNION ALL

Select 2 as PKID,1 as OutMailID,'2010/01/01' as JobMailingDate,'2010/01/02' as InsertDatetime 
UNION ALL

Select 3 as PKID,1 as OutMailID,'2010/01/01' as JobMailingDate,'2010/01/03' as InsertDatetime 
UNION ALL

Select 4 as PKID,1 as OutMailID,'2010/01/01' as JobMailingDate,'2010/01/04' as InsertDatetime 

我想在一个查询中执行以上所有2个步骤,所以我的查询就像这样

Select 
    OutMailID,Min(InsertDatetime)
from 
    Table T
    INNER JOIN 
    (
        Select 
            OutMailID
        from 
            Table 
        Where 
            InsertDatetime Between @Param1 and @Param2
    ) as T1 On (T1.OutMailID = T.outMailID)
Group by 
    OutMailID
Having Min(InsertDatetime) Between Between @Param1 and @Param2

但这并不是表现良好。任何人都可以建议我这样做的好方法

第二个问题是,一旦我有第一个查询的输出,那么我使用相同的上述查询为其他类别找出该类别中的最小InsertDatatime,一旦我拥有所有类别的所有最小日期然后我有在所有类别中找到最小插入日期

你能帮帮我吗

由于 阿图尔

2 个答案:

答案 0 :(得分:0)

如何在这个msbuild /p:ContinueOnError=ErrorAndContinue /p:Configuration=Debug OpenCV.sln 语句中使用,with就像保存缓存中的所有内容以供日后使用的视图一样,这是一个例子

with

这样,您可以多次重复使用with Table1 as ( Select OutMailID from Table Where InsertDatetime Between @Param1 and @Param2 ), Table2 as ( Select 4 as PKID,1 as OutMailID,'2010/01/01' as JobMailingDate,'2010/01/04' as InsertDatetime ) select * from Table as T inner join Table1 as T1 on T1.OutMailID = T.outMailID group by T.OutMailID 而无需再次重新查询。

答案 1 :(得分:0)

此查询是否能为您提供所需的结果?

选择T.OutMailID,Min(T.InsertDatetime) 来自表T INNER JOIN表T1在T1.OutMailID = T.outMailID上     T2.InsertDatetime介于@ Param1和@Param2之间 由OutMailID分组