【问题标题】:One to many resultset based on start and end year基于开始和结束年份的一对多结果集
【发布时间】:2019-04-05 11:21:28
【问题描述】:

我正在尝试根据下表返回一个结果集,其中包括每辆车的品牌、型号、描述和年份。我不明白的部分是在给定座位的开始和结束年份之间每年返回一行。

例如,如果座位运行 2002-2008,我想返回 2002、2003、2004 的行...

制作: MakeId, MakeName

型号: ModelId、MakeId、ModelName

座位: SeatId、ModelId、StartYear、EndYear、描述

当前单行查询如下:

SELECT Make.MakeName, Model.ModelName, Seats.StartYear, Seats.EndYear, Seats.Description
FROM Make
INNER JOIN Model ON Make.MakeId = Model.MakeId
INNER JOIN Seats ON Seats.ModelId = Model.ModelId

提前致谢!

【问题讨论】:

  • 如果您有一张包含所有年份的表格,例如numbers tabletally table,您可以 join 它与其他表格一起获得合适的行集合。搜索[tsql] tally table 应该是有效的。
  • 谢谢哈宝。虽然计数表最终并不是我所需要的,但它让我走上了只为每个 ModelId 填充一个带有连续年份的临时表的路径

标签: sql-server tsql


【解决方案1】:
DECLARE @MIN_YEAR INTEGER = (SELECT MIN(StartYear) FROM [dbo].[Seats]);
DECLARE @MAX_YEAR INTEGER = (SELECT MAX(EndYear) FROM [dbo].[Seats]);

WITH CTE AS (
    SELECT @MIN_YEAR AS Year
    UNION ALL
    SELECT Year + 1 FROM CTE
    WHERE Year < @MAX_YEAR
)
SELECT Make.MakeName, Model.ModelName, Seats.StartYear, Seats.EndYear, 
Seats.Description
FROM Make
INNER JOIN Model ON Make.MakeId = Model.MakeId
INNER JOIN Seats ON Seats.ModelId = Model.ModelId
CROSS APPLY ( SELECT * FROM CTE WHERE Year BETWEEN Seats.StartYear AND Seats.EndYear ) T 
OPTION
(
    MAXRECURSION 0
)

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 2016-08-12
    • 2018-01-13
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多