2015-03-03 72 views
0

我有5個表:最近的日期和價格從SQL Server中的多個表

​​

contracts列:

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

contracts_data列:

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

uontracts_anexes專欄:

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

anexes列:

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

anexes_Data列:

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

現在我需要選擇(從contracts_dataanexes_data),其中籤的日期是最近(最大date_sign價格從contractsanexes),但並非全部id_contract都在表contracts_anexes(並非所有的合同有一個附件),一包(id_contract)可能有多個anexes(在contracts_anexes表多行)

例如

  • id_contract = 1我需要返回的價格300和日期2014 -06-05,
  • id_contract = 2我需要回到400的價格及日期2015-01-12
  • id_contract = 3我需要回到300的價格和日期2014年10月12日
+1

添加您嘗試的樣本數據和預期結果以及查詢。這個問題非常令人困惑,因爲有兩個帶有'price'的表格和兩個帶有'date_sign'的表格 – 2015-03-03 07:29:50

+0

如果最近的'date_sign'在'anexes_data'中,但最高價格在'contracts_data'中怎麼辦? – 2015-03-03 07:52:52

+0

@wewesthemenace沒有提到最高價格,只是最近的日期。 – philipxy 2015-03-03 07:54:21

回答

1

您可以用ROW_NUMBER一起使用UNION ALL

;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

+0

很好,謝謝! – user1762186 2015-03-03 08:15:06

相關問題