1

假设我有一个表应用程序如下

ApplicationId INT,
CustomerId INT,
ApplicationDate DATETIME,
IsNewCustomer BOOL

我想检索给定日期的应用程序列表以及IsNewCustomer标志(如果给定的 CustomerId 没有应用程序,则设置该标志。

目前我在同一张表上使用如下连接

select 
    o.ApplicationId as ApplicationId,
    cast(o.ApplicationDate as date) as ApplicationDate,
    case when n.ApplicationID is not null then 1 else 0 end as IsNewCustomer,
    row_number() over (partition by o.ApplicationId order by o.ApplicationDate desc) as AppSeqNum
from 
    Applications o 
    left join Applications n 
        on n.CustomerId = o.CustomerId
        and n.ApplicationDate < o.ApplicationDate
where
    AppSeqNum = 1
    and ApplicationDate = getdate()

我想知道是否有更好的方法来实现相同的目标,而不必加入同一张桌子,因为它“感觉”不是最优雅的解决方案。

谢谢!

4

1 回答 1

0

好吧,您可能会使用子查询,但这只会掩盖您的自联接。自联接本质上没有任何问题,如果您没有正确的索引和约束并且表大小有限,它们可能会失控。您可能听说自联接不好的原因之一是在其他连续单调序列中寻找中断的问题。假设您有一千个值,其中缺少 5 个,并且您在 value = value +1 上进行了自联接(没有索引或约束),那么查询优化器很可能会在尝试找到 5 之前确定有 1000*1000 个可能的行空匹配。因此,如果您的结果集相当有限,那么没问题。

于 2013-03-12T17:47:20.703 回答