[英]SQL - Join two tables without unique fields
这是我在该论坛上的第一篇文章,因此请谅解。
我有以下问题。
我想两个表两个联接:
表格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函数,以使每个产品一行(具有最新开始日期的产品)排成一行,然后再与第一张表简单地连接起来。 但是我不知道如何做第一部分。
我真的很期待您的帮助。
问候,马特
只需使用WHERE NOT EXISTS即可过滤除TABLE2中的最新日期以外的所有内容(我假设您要从TABLE2中查询最新的STARTDATE;我还将“ SomeOtherField”添加到Table1中,因为否则可以只查询Table2):
选择t1.Product,t1.SomeOtherField,t2.StartDate,t2.EndDate,t2.Value
从表1 t1
JOIN(从表2中选择a.Product,a.StartDate,a.EndDate,a.Value
不存在的地方(选择*从表2 b
其中b.Product = a.Product AND b.StartDate> a.StartDate))t2
开启(t2.Product = t1.Product)
这是可能的,查询将涉及三个步骤:
product
所有最大start date
。提示:使用分组依据。 Value
。 不确定示例中是否完全需要Table1
,只需要汇总Table2
即可找到每个Product
的MAX([Start Date]
:
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()
函数使其更干净:
;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
这是在SQLServer中使用ROW_NUMBER
的解决方案:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY Product ORDER BY StartDate DESC) RN
FROM @T
) Results
WHERE RN = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.