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

サブクエリを使用することもできますが、それは自己結合を偽装するだけです。自己結合には本質的に問題はありません。適切なインデックスと制約がなく、テーブルサイズが制限されている場合、自己結合は手に負えなくなる可能性があります。自己結合が悪いと聞いたことがあるかもしれない理由の1つは、そうでなければ連続的な単調なシーケンスでブレークを見つける問題です。1000個の値があり、5個が欠落していて、値=値+1で自己結合(インデックスや制約なし)を実行すると、クエリoptiiserは、5個を見つける前に1000*1000個の可能な行があると判断する可能性があります。 nullが一致します。したがって、適度に制限された結果が設定されている場合は、問題ありません。

于 2013-03-12T17:47:20.703 に答える