2010-07-19 51 views
1

我目前正在开发一个转换脚本,用于将一堆旧数据从SQL Server 2000数据库转移到SQL Server 2008上。我在这个转换过程中试图完成的事情是消除所有的组合键,并用一个“正确的”主键替换它们。显然,当我传输数据时,我需要将外键值注入到新的表结构中。SQL - 在另一个表中获取最大生效日期小于日期

我目前被困在一个数据集,但我似乎无法让我的头以集合为基础的方式。我工作的两张桌子叫做“收费和法律”。他们有3对1:1关系和“链接”。前两个是LawSource和LawStatue专栏的平等链接,但第三个专栏给我带来了问题。 ChargeDate栏应链接到LawDate专栏,其中LawDate < = ChargeDate。

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

这是我目前有:

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

在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 
1

如果性能是不是一个问题,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另外计费表中的行。

若要包括来自Law而没有匹配的行Charge,请将cross apply更改为outer apply

+0

我收到语法错误,当我尝试这...跨应用和外部申请有效的SQL Server 2K? – 2010-07-19 21:21:06

+0

交叉申请从2005年开始。考虑在变换数据之前移动数据:) – Andomar 2010-07-19 21:28:26

相关问题