2015-04-21 70 views
0

這是我在這個論壇的第一篇文章,請予以諒解。SQL - 連接兩個表沒有獨特的領域

我有以下問題。

我想兩個連接兩個表:

表1:

Product | Start Date | End Date 
------------------------------------- 
Product1 | 01/01/2014 | 01/05/2015 
Product2 | 01/03/2014 | 01/01/2015 

表2:

Product | Start Date | End Date | Value 
-------------------------------------------- 
Product1 | 01/01/2014 | 01/02/2015 | 10 
Product1 | 02/02/2014 | 01/04/2015 | 15 
Product1 | 02/04/2014 | 01/05/2015 | 15 
Product2 | 01/03/2014 | 04/05/2014 | 5 
Product2 | 05/05/2014 | 01/01/2015 | 5 

要與一臺最新的值,如:

Product | Start Date | End Date | Value 
------------------------------------------------ 
Product1 | 02/04/2014 | 01/05/2015 | 15 
Product2 | 05/05/2014 | 01/01/2015 | 5 

我需要加入而不是隻使用第二個表,因爲它們都有我需要使用的更多獨特列。

我在考慮首先在第二張桌子上使用某種類型的IF函數來爲每個產品(最新開始日期的那一行)製作一行,然後再簡單地使用第一張表進行加入。但我不知道如何做第一部分。

我真的很期待您的幫助。

問候, 馬特

+0

所以,它聽起來像產品+起始+結束是獨一無二的表1,但代表如表2所示。是對的嗎?你想總結Table2的值嗎? –

+1

你如何從'Table2'中決定使用哪一行? –

+0

您使用的數據庫是? –

回答

0

只需使用WHERE NOT EXISTS過濾除TABLE2中最新日期以外的所有內容(我假設您要求TABLE2中的最新STARTDATE;我也添加'SomeOtherField'到Table1,因爲否則您可以查詢Table2):

SELECT t1.Product,t1.SomeOtherField,t2.StartDate,t2.EndDate,t2。值

FROM表1 T1

JOIN(SELECT a.Product,a.StartDate,a.EndDate,a.value中FROM表2一

WHERE NOT EXISTS(SELECT * FROM表2 b

WHERE b.Product = a.Product和b.StartDate> a.StartDate))T2

ON(t2.Product = t1.Product)

0

這是可能的,查詢將涉及三個步驟:

  1. 查找表2.提示每個product所有最大start date:使用GROUP BY。
  2. 加入表2#1的結果得到Value
  3. 加入表1與#2的結果過濾掉不在表1
0

不知道你需要Table1都在你的榜樣,你只需要合計Table2找到MAX([Start Date]產品每個Product

SELECT a.* 
FROM Table2 a 
JOIN (SELECT Product,MAX([Start Date]) AS Mx_Start_Dt 
     FROM Table2 
     GROUP BY Product 
    ) b 
    ON a.Product = b.Product 
    AND a.[Start Date] = b.Mx_Start_Dt 

如果確實需要從Table領域帶來你可以添加其他JOIN

SELECT a.*,b.* 
FROM Table1 a 
JOIN (SELECT a.* 
     FROM Table2 a 
     JOIN (SELECT Product,MAX([Start Date]) AS Mx_Start_Dt 
      FROM Table2 
      GROUP BY Product 
      ) b 
     ON a.Product = b.Product 
      AND a.[Start Date] = b.Mx_Start_Dt 
    ) c 
    ON a.Product = b.Product 

如果使用支持分析功能的數據庫,你可以把它通過ROW_NUMBER()功能清潔:在SQLServer是使用ROW_NUMBER解決

;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Product ORDER BY [Start Date] DESC) AS RN 
       FROM Table2 
      ) 
SELECT * 
FROM Table1 a 
JOIN cte b 
    ON a.Product = b.Product 
    AND b.RN = 1 
0

這裏:

SELECT * 
FROM (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY Product ORDER BY StartDate DESC) RN 
    FROM @T 
) Results 
WHERE RN = 1