代码之家  ›  专栏  ›  技术社区  ›  Sonny Boy

SQL-获取小于另一个表中某个日期的最大有效日期

sql
  •  1
  • Sonny Boy  · 技术社区  · 16 年前

    我目前正在编写一个转换脚本,将一堆旧数据从SQL Server 2000数据库传输到SQL Server 2008。在这个转换过程中,我要做的一件事是消除所有的组合键,并用一个“合适的”主键替换它们。显然,当我传输数据时,我需要将外键值注入到新的表结构中。

    不过,我目前只能处理一个数据集,似乎无法以基于数据集的方式处理它。我工作的那两张桌子叫做“电荷和法律”。它们有一个1:1的关系,在三列上有“链接”。前两列在Lawsource和Lawspeducture列上是相等的链接,但第三列给我带来了问题。ChargeDate列应链接到LawDate列,其中LawDate<=ChargeDate。

    我当前的查询是返回给定费用的多行(在某些情况下),因为法律可能有多个小于或等于ChargeDate的LawDate。

    以下是我目前拥有的:

    select LawId
    from Law a
    join Charge b on b.LawSource = a.LawSource 
                     and b.LawStatute = a.LawStatute 
                     and b.ChargeDate >= a.LawDate
    

    我可以用什么方法重写这个来获取法律表中与ChargeDate相同(或更早)的最新条目?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Donnie    16 年前

    这在使用分区函数的SQL 2008中会更容易(因此,将来对您来说应该更容易)。

    通常的警告是“我没有你的模式,所以这不是测试”应用程序,但我认为它应该做你需要的。

    select
      l.LawID
    from
      law l
      join (
        select 
          a.LawSource,
          a.LawStatue,
          max(a.LawDate) LawDate
        from 
          Law a
          join Charge b on b.LawSource = a.LawSource 
                         and b.LawStatute = a.LawStatute 
                         and b.ChargeDate >= a.LawDate
        group by
          a.LawSource, a.LawStatue
      ) d on l.LawSource = d.LawSource and l.LawStatue = d.LawStatue and l.LawDate = d.LawDate
    
        2
  •  1
  •   Andomar    16 年前

    如果性能不是问题, cross apply 提供了一种非常易读的方式:

    select  *
    from    Law l
    cross apply
            (
            select  top 1 *
            from    Charge
            where   LawSource = l.LawSource 
                    and LawStatute = l.LawStatute 
                    and ChargeDate >= l.LawDate
            order by
                    ChargeDate
            ) c
    

    对于每一行,这将查找ChargeDate最小的ChargeTable中的行。

    包含以下行的步骤 Law 没有匹配项 Charge 改变 交叉申请 outer apply .