SQL 服务器中多个表的最新日期和价格

Most recent date and price from multiple tables in SQL Server

我有 5 个 table:

contracts, contracts_data, contracts_anexes, anexes, anexes_data

Table contracts 列:

id_contract |  date_sign
------------+-----------
    1       | 2013-01-03
    2       | 2013-06-05
    3       | 2014-10-12

Table contracts_data 列:

id_contract | price
------------+------
     1      | 100
     2      | 200
     3      | 300

Table uontracts_anexes 列:

id_contract | id_anex
------------+--------
    1       |    1
    1       |    2
    2       |    3

Table anexes 列:

id_anex | date_of_sign 
--------+--------------
   1    | 2014-01-03
   2    | 2014-06-05
   3    | 2015-01-12

Table anexes_Data 列:

id_anex | price
--------+------
   1    | 200
   2    | 300
   3    | 400

现在我需要 select 价格(来自 contracts_dataanexes_data),其中签名日期最近(最大 date_sign 来自 contractsanexes),但并非所有 id_contract 都在 table contracts_anexes 中(并非所有合同都有附件),一份合同(id_contract)可能有多个anexescontracts_anexes table 中的多行)

例如

您可以将 UNION ALLROW_NUMBER 一起使用:

;WITH CteUnion AS(
    SELECT
        id_contract = c.id_contract,
        price = cd.price,
        date_sign = c.date_sign
    FROM contracts c
    LEFT JOIN contracts_data cd
        ON cd.id_contract = c.id_contract

    UNION ALL

    SELECT
        id_contract = c.id_contract,
        price = ad.price,
        date_sign = a.date_sign
    FROM contracts c
    LEFT JOIN contracts_anexes ca
        ON ca.id_contract = c.id_contract
    LEFT JOIN anexes a
        ON a.id_anex = ca.id_anex
    LEFT JOIN anexes_data ad
        ON ad.id_anex = a.id_anex
)
SELECT
    id_contract,
    price,
    date_sign
FROM(
    SELECT *, RN = ROW_NUMBER() OVER(PARTITION BY id_contract ORDER BY date_sign DESC)
    FROM CteUnion
)c
WHERE RN = 1

参见SQL Fiddle