我们说我有一个 Applications 表格如下
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()
我想知道是否有更好的方法来实现同样的目标,而不必加入同一张桌子,因为它没有感觉到&#39;喜欢最优雅的解决方案。
谢谢!
答案 0 :(得分:0)
好吧,您可以使用子查询,但这只是伪装您的自我加入。自连接没有任何本质上的错误,如果你没有正确的索引和约束并且表格大小有限,它们可能会失控。您可能听说过自联接不好的原因之一是在一个连续的单调序列中找到中断的问题。假设您有一千个值,缺少5个,并且您在value = value +1上执行自连接(没有索引或约束),那么查询optiiser可能会在尝试查找5之前确定有1000 * 1000个可能的行空匹配。所以,如果你有一个相当有限的resuts设置,那么没问题。