0

Contracts、Bills、および Companies という名前の 3 つのテーブルがあり、3 つのテーブルすべてをリンクする「ContractID」という名前の値に内部結合しています。そのクエリはうまく機能していますが、最新の結果のみを取得したいと考えています。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 結果のみが返されるように、誰かがクエリを調整するのを手伝ってくれますか?

4

2 に答える 2

4

クエリが希望どおりに並べられている場合は、 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 
于 2012-11-26T21:11:25.827 に答える
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
于 2012-11-26T21:16:32.150 に答える