如何仅从3个连接表中返回查询中的最新结果

时间:2012-11-26 21:04:47

标签: sql-server sql-server-2005 inner-join

我有3个名为Contracts,Bills和Companies的表,我们内部加入了一个名为“ContractID”的值,它连接了所有3个表。我的查询运行良好,但我希望只提取最新结果。 ContractID字段可以从Contract表中返回具有不同日期的多个结果,因此DISTINCT无法缩小范围。

当前查询如下:

SELECT cn.ContractID
    , cn.Vendor
    , cn.ContractDate
    , b.ContractID
    , b.TotalBill
    , b.CurrentDue
    , cm.ContractID
    , cm.CompanyID
    , cm.[Description]
FROM [Contract] cn
INNER JOIN Company cm
    ON cn.ContractID = cm.ContractID
INNER JOIN Bill b
    ON cn.ContractID = b.ContractID

我正在使用MSSQLServer 2005.有人可以帮我调整查询,以便它只返回每个ContractID的最新ContractDate结果吗?

2 个答案:

答案 0 :(得分:4)

如果您的查询按照您希望的方式进行排序,您只需在查询中添加选择Top 1,这将为您提供第一行:

SELECT Top 1 cn.ContractID , cn.Vendor , cn.ContractDate , b.ContractID 
     , b.TotalBill, b.CurrentDue, cm.ContractID, cm.CompanyID, cm.[Description] 
  FROM [Contract] cn 
 INNER JOIN Company cm ON cn.ContractID = cm.ContractID 
 INNER JOIN Bill b ON cn.ContractID = b.ContractID 
 order by cn.ContractDate DESC 

答案 1 :(得分:1)

使用RANK() OVER为每个ContractID提供排名,然后只选择排名为1的那些。例如:

SELECT * 
FROM
(
    SELECT      
        Contract.ContractID, 
        Contract.Vendor, 
        Contract.ContractDate, 
        Bill.ContractID, 
        Bill.TotalBill,
        Bill.CurrentDue, 
        Company.ContractID, 
        Company.CompanyID, 
        Company.Description,
        RANK() OVER (ORDER BY ContractDate DESC) as RecordRank
    FROM Contract
    INNER JOIN Company 
        ON Contract.ContractID = Bill.ContractID
    INNER JOIN Bill 
        on Company.ContractID = Bill.ContractID
) qry
WHERE RecordRank = 1