SQL Server:如何更改此查询以使用带有日期列的子查询?

时间:2017-05-24 17:58:17

标签: sql sql-server tsql subquery

我的查询大约有20列,为简洁起见,我显示*

SELECT TOP 1
    *
FROM 
    [Frontier].[dbo].[tblLoadFile]
WHERE
    TN = 4132644856
ORDER BY 
    CallTime DESC

我被告知我应该在max calldate上使用subquery,因为它是编写查询的“更快”和“正确”的方式。

我如何以及在哪里放入max(calldate)子查询?

这适用于SQL Server / T-SQL

2 个答案:

答案 0 :(得分:0)

假设您没有尝试更改当前查询的逻辑,那么使用MAX子查询替换TOP 1 / Order by的方式将是这样的:

SELECT *
FROM [Frontier].[dbo].[tblLoadFile]
where TN = 4132644856
AND CallTime = (SELECT MAX(CallTime) 
                FROM  [Frontier].[dbo].[tblLoadFile]
                where TN = 4132644856)

但是,正如我在评论中提到的,如果存在平局,这可能会产生多行,并且它不一定更快,具体取决于表的索引方式。

答案 1 :(得分:0)

也许您可以在不使用MAX的情况下考虑,并保证返回一行。

SELECT *
FROM (SELECT *
            , ROW_NUMBER() OVER (ORDER BY CallTime DESC) AS Rownum
        FROM [Frontier].[dbo].[tblLoadFile]
        WHERE TN = 4132644856
) a
WHERE a.Rownum = 1