【问题标题】:how to join two tables with one to many relationship如何以一对多的关系连接两个表
【发布时间】:2013-10-17 04:44:44
【问题描述】:

我使用的是 MS SQL Server 2008。

我有两张桌子。

第一个包含两列日期时间类型的 StartDate 和 EndDate 以及 ProductID (int)。

第二个表包含日期时间列 SaleDate 和 ProductID。

我想要完成的是创建一个表,其中包含 ProductID、StartDate、EndDate 和每个产品 ID 的销售数量,确保只有在 startDate 和 EndDate 之间发生的销售包含在结果表中。

在尝试与第一个表连接之前,我从第二个表中提取数据,按 ProductID 分组。

提前致谢!

【问题讨论】:

  • 这听起来更像是你需要一个view,而不是一张桌子
  • 您的第二个表有两个字段,SaleDateProductID。你说你从第二个表中提取数据ProductID分组?你对SaleDate 做了什么?您能展示一下您尝试过的 SQL 语句吗?

标签: sql sql-server


【解决方案1】:

我没有机会尝试这个,但它应该可以工作。

select f.ProductID, f.StartDate, f.EndDate, count(*) as Sales
from firstTable f
inner join secondTable s on s.ProductID = f.ProductID
where s.SaleDate between f.StartDate and f.EndDate
group by f.ProductID, f.StartDate, f.EndDate

【讨论】:

  • 请把加入条件放在ON 子句中,过滤条件放在WHERE 子句中。除了在某些情况下得到意想不到的结果外,它更具可读性。
  • @alzaimar 你是对的。感谢您指出了这一点。我的大脑在写到一半时决定像左连接一样开始写它。已编辑和修复。
【解决方案2】:

非常基本:

SELECT    a.ProductID, a.StartDate, a.EndDate, COUNT(*) AS Sales
FROM      TAB1 a
LEFT JOIN TAB2 b
ON        a.ProductID = b.ProductID
          AND b.SaleDate >= a.StartDate
          AND b.SaleDate <= a.EndDate
GROUP BY  a.ProductID, a.StartDate, a.EndDate;

【讨论】:

    【解决方案3】:

    获取所需信息的实际查询本身非常简单:

    -- NOTE: if you want to exclude product records for which there
    -- are no sales, use an INNER JOIN instead
    SELECT p.ProductID, p.StartDate, p.EndDate, COUNT(*) [NumSales]
    FROM Products p
    LEFT JOIN Sales s 
        ON s.ProductID = p.ProductID
    WHERE s.SaleDate BETWEEN p.StartDate AND p.EndDate
    GROUP BY p.ProductID, p.StartDate, p.EndDate
    

    但是,我建议不要根据这些信息制作单独的表格,因为它需要不断更新。相反,如果这是一个您认为会经常运行的查询,那么我建议将其转换为 VIEW

    CREATE VIEW CountSalesView AS
        SELECT p.ProductID, p.StartDate, p.EndDate, COUNT(*) [NumSales]
        FROM Products p
        LEFT JOIN Sales s
            ON s.ProductID = p.ProductID
        WHERE s.SaleDate BETWEEN p.StartDate AND p.EndDate
        GROUP BY p.ProductID, p.StartDate, p.EndDate
    

    从那里,您可以在需要最新信息的任何时候像查询表格一样查询它:

    SELECT * 
    FROM CountSalesView
    

    这里有一些例子:

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 1970-01-01
      • 2015-09-08
      • 2016-11-10
      • 2020-09-27
      • 2017-06-23
      • 2018-06-14
      • 1970-01-01
      • 2014-09-01
      相关资源
      最近更新 更多