繁体   English   中英

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

[英]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)

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

  1. 在表2中找到每个product所有最大start date 。提示:使用分组依据。
  2. 将表2与#1的结果结合起来,以获取Value
  3. 将表1与#2的结果结合起来,以过滤掉表1中没有的产品。

不确定示例中是否完全需要Table1 ,只需要汇总Table2即可找到每个ProductMAX([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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM