【问题标题】:Get Latest ModifiedDate Joining Multiple Tables获取最新的 ModifiedDate 加入多个表
【发布时间】:2021-03-09 03:04:34
【问题描述】:

我有 4 张桌子

  1. 项目表

    projectid: INT (pk)
    modifiedDate: DateTime2
    ...
    
  2. ProjectFinalizeTable

    id: INT (pk)
    projectid: INT (fk)
    modifiedDate: DateTime2
    ...
    
  3. 项目附加时间表

    id: INT (pk)
    projectid: INT (fk)
    modifiedDate: DateTime2
    ...
    
  4. 项目完成表

    id: INT (pk)
    projectid: INT (fk)
    modifiedDate: DateTime2
    ...
    

任何表都会根据用户的操作进行修改。所有表的 projectId 都是 ProjectTable 中的 foreignKey。

我想从任何表中获取最新的modifiedDate。例如:ProjectFinalizeTable 可以有最新的modifiedDate,这样查询就会返回那个日期。

为了让你知道我想要什么,就像下面的查询(注意:下面的查询只是为了让你知道我到底在寻找什么)

Select MAX(pt.modifiedDate, pat.modifiedDate, pft.modifiedDate, pct.modifiedDate) as latestModifiedDate 
from ProjectTable pt 
join ProjectFinalizeTable pft pt.projectid = pft.projectid
join ProjectAdditionalTimeTable pat pt.projectid = pat.projectid
join ProjectCompleteTable pct pt.projectid = pct.projectid

我已经通过many links,但找不到从多个表中计算MAX(Date) 的方法。

【问题讨论】:

  • 请向我们展示 1) 示例数据(格式化文本)2) 预期结果(格式化文本)3) 您目前的尝试...
  • @DaleK,我认为这里我们不需要样本数据,表格结构非常清晰。我想不出任何解决方案,所以我没有尝试任何查询。无法理解如何通过比较多个表来计算 MAX(Date)。 我只想知道如何从多个表中计算 MAX(Date)。
  • 它对你来说当然是显而易见的,它是你的系统,但对我来说并不明显(可能对其他人也不明显)......你的问题越清晰,你提供的细节越多,速度越快你会得到答案。您必须能够产生一些查询,而不是获得您想要的数据的查询。如果您将示例数据添加为 DDL/DML(即填充的临时表),它甚至可以很容易地为您提供帮助,因为我们不必输入测试数据。当需要使用特定数据而不是理论问题时,SQL 问题更容易回答

标签: sql sql-server tsql datetime join


【解决方案1】:

鉴于您希望 max(modifiedDate) 覆盖多个表,似乎将它们合并并聚合它们是可行的方法。

with cte as (
    select projectId, modifiedDate
    from dbo.ProjectTable
    union all
    select projectId, modifiedDate
    from dbo.ProjectFinalizeTable
    union all
    select projectId, modifiedDate
    from dbo.ProjectAdditionalTimeTable
    union all
    select projectId, modifiedDate
    from dbo.ProjectCompleteTable
)
select projectId, max(modifiedDate)
from cte
group by projectId;

【讨论】:

  • 验证结果即可。看起来很有希望!不过使用联合的好方法。
  • 结果对我来说似乎不错。由于我们使用的是union all,所以当记录很多时会不会出现性能问题?
  • 不应该,只要您在所有表上都有良好的索引。 union all 的性能并不差,它的 union 在对结果进行重复数据处理时可能会性能很差。
【解决方案2】:

你可以试试这个。虽然我无法验证。

SELECT 
   PT.projectid,
   (SELECT MAX(LastModifiedDate)
      FROM (VALUES (PT.ModifiedDate),(PFT.ModifiedDate),(PATT.ModifiedDate), (PCT.ModifiedDate)) AS UpdateDate(LastModifiedDate)) 
    AS LastModifiedDate
FROM
ProjectTable PT
JOIN ProjectFinalizeTable PFT ON PT.projectid = PFT.projectid
JOIN ProjectAdditionalTimeTable PATT ON PT.projectid = PATT.projectid
JOIN ProjectCompleteTable PCT ON PT.projectid = PCT.projectid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-14
    • 2018-06-26
    • 1970-01-01
    • 2012-08-07
    • 2017-08-17
    • 2023-01-21
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多