Sql server 如何在查询中仅从3个联接表返回最新结果

Sql server 如何在查询中仅从3个联接表返回最新结果,sql-server,sql-server-2005,inner-join,Sql Server,Sql Server 2005,Inner Join,我有三个名为Contracts、Bills和Companys的表,我在一个名为“ContractID”的值上内部联接了这些表,该值链接了所有三个表。我有一个查询工作良好,但我只希望最新的结果被拉。Contractd字段可以从具有不同日期的合同表返回多个结果,因此DISTINCT无法缩小其范围 当前查询如下: SELECT cn.ContractID , cn.Vendor , cn.ContractDate , b.ContractID , b.TotalBill

我有三个名为Contracts、Bills和Companys的表,我在一个名为“ContractID”的值上内部联接了这些表,该值链接了所有三个表。我有一个查询工作良好,但我只希望最新的结果被拉。Contractd字段可以从具有不同日期的合同表返回多个结果,因此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

我正在使用MSSQLServer2005。有人能帮我调整查询,使其只返回每个收缩的最新ContractDate结果吗?

如果您的查询按您希望的方式排序,您只需将select 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 

如果您的查询按您希望的方式排序,只需将select 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的对象。例:

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
用于为每个收缩的对象指定一个等级,然后仅选择等级为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

您的意思是类似于
ORDER BY Contract.ContractDate DESC LIMIT 1
?编辑问题以使用别名和更好的格式。您的意思是类似于
ORDER BY Contract.ContractDate DESC LIMIT 1
?编辑问题以使用别名和更好的格式。选择前1个cn.Contract,cn.Vendor,cn.ContractDate,b.contracted,b.TotalBill,b.CurrentDue,cm.contracted,cm.CompanyID,cm。[说明]来自[合同]中国内部加入公司cm ON cn.contracted=cm.contracted内部加入票据b ON cn.contracted=b.contracted订单by cn.contracted日期描述您可以编辑您的问题;没有必要在评论中发布额外内容。Joe,不幸的是,我不想只返回一份合同,我想从每份合同中选择最新的一行。从[contract]中选择排名前1的cn.ContractID、cn.Vendor、cn.ContractDate、b.ContractID、b.TotalBill、b.CurrentDue、cm.ContractID、cm.CompanyID、cm。[说明]来自[contract]cn内部加入公司cm ON cn.constractd=cm.constractd内部加入账单b ON cn.constractd=b.constractd订单由cn.ContractDate desc您可以编辑您的问题;没有必要在评论中发布额外内容。Joe,不幸的是,我不想只返回一份合同,我想要每个合同中最新的一行。