SQL - 连接两个没有唯一字段的表

时间:2015-04-21 15:54:31

标签: 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函数来为每个产品创建一行(具有最新开始日期的那一行),然后再将其与第一个表一起加入。但我不知道如何做第一部分。

我真的很期待你的帮助。

此致 马特

4 个答案:

答案 0 :(得分:1)

只使用WHERE NOT EXISTS过滤除TABLE2中的最新日期之外的所有日期(我假设您要求TABLE2中的最新STARTDATE;我也将'SomeOtherField'添加到Table1,因为否则您只能查询Table2) :

SELECT t1.Product,t1.SomeOtherField,t2.StartDate,t2.EndDate,t2.Value

FROM Table1 t1

JOIN(选择a.Product,a.StartDate,a.EndDate,a.Value FROM Table2 a

不存在(SELECT * FROM Table2 b

WHERE b.Product = a.Product AND b.StartDate> a.StartDate))t2

ON(t2.Product = t1.Product)

答案 1 :(得分:0)

这是可能的,查询将涉及三个步骤:

  1. 查找表2中每个start date的所有最大product。提示:使用group by。
  2. 使用#1的结果加入表2以获取Value
  3. 使用#2的结果连接表1,以过滤掉表1中没有的产品。

答案 2 :(得分:0)

您的示例中根本不确定是否需要Table1,您只需要汇总Table2以查找每个MAX([Start Date]的{​​{1}}:

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()

答案 3 :(得分:0)

以下是在SQLServer中使用ROW_NUMBER的解决方案:

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