[英]SQL - Joining same table
假設我有一個表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()
我想知道是否有更好的方法來實現相同目的而不必加入同一張表,因為它不像最優雅的解決方案那樣“感覺”到。
謝謝!
好的,您可以使用子查詢,但這只會掩蓋您的自我加入。 自聯接沒有內在的錯誤,如果您沒有正確的索引和約束並且表的大小受到限制,它們就可能失控。 您可能聽說自連接不好的原因之一是在其他連續單調序列中找到中斷的問題。 假設您有一千個值,而缺少五個,並且對值=值+1進行了自我聯接(沒有索引或約束),那么查詢優化器很可能會確定找到1000 * 1000個可能的行,然后再查找5個空匹配。 因此,如果您的結果集受到合理的限制,那就沒問題了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.