繁体   English   中英

SQL Select最佳做法

[英]SQL Select Best practice

以下工作,我想知道这是否是为每个审核字段查找最新值的正确方法。

USE tempdb
CREATE Table Tbl(
TblID Int,
AuditFieldID Int,
AuditValue Int,
AuditDate Date
)
GO
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(1,10,101,'1/1/2001')
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(2,10,102,'1/1/2002')
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(3,20,201,'1/1/2001')
INSERT INTO Tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(4,20,202,'1/1/2009')


SELECT AuditFieldID,AuditValue,AuditDate
FROM Tbl A
WHERE TblID=
(SELECT TOP 1 TblID
FROM Tbl
WHERE AuditFieldID=A.AuditFieldID
ORDER BY AuditDate DESC
)

更简单:

SELECT top 1 AuditFieldID,AuditValue,AuditDate从Tbl顺序按AuditDate DES

有多种方法可以执行此操作。 不同的方法执行不同。 我鼓励您查看这个博客,其中介绍了各种方法。

包括汇总列的相关值

汇总/排序以获取关键和最新日期,重新加入以获取价值。

假设使用SQL Server 2005+

DECLARE @tbl Table (
TblID Int,
AuditFieldID Int,
AuditValue Int,
AuditDate Date
)

INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(1,10,101,'1/1/2001')
INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(2,10,102,'1/1/2002')
INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(3,20,201,'1/1/2001')
INSERT INTO @tbl(TblID,AuditFieldID,AuditValue,AuditDate) VALUES(4,20,202,'1/1/2009')


;WITH cLatest AS
(
    SELECT
        ROW_NUMBER() OVER (PARTITION BY AuditFieldID ORDER BY AuditDate DESC) AS Ranking,
        AuditFieldID, AuditDate
    FROM
        @tbl
)
SELECT
    A.AuditFieldID, A.AuditValue, A.AuditDate
FROM
    @tbl A
    JOIN
    cLatest C ON A.AuditFieldID = C.AuditFieldID AND A.AuditDate = C.AuditDate
WHERE
    C.Ranking = 1

您不需要where语句,因为您已经从tbl A中选择并在同一字段上进行选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM