1
顧客が新規であるか既存であるかを評価するより効率的な方法が必要です。新規顧客のための 基準:SQL:階層型(関連する)顧客と新規または既存の顧客タイプを評価
- お客様、または関連顧客は、私がこれを行うための機能を書き、それが動作を開始日と終了日
間の順序を置いていませんそれは非常に遅いです。私たちは、子供、親、究極の親を持つ階層的な顧客を持っています。私の機能は、特定の顧客の最終的な親を取得し、すべての子を選択し、その子に属するオーダーが開始日と終了日の間にordersテーブルに存在するかどうかを評価することによって機能します。
この関数は、新規顧客に対しては1(真)、既存の顧客に対しては0(偽)を返します。
これを行うより効率的な方法はありますか? 〜3kのレコードで呼び出されたとき、私の関数の実行には約20分かかりました。
機能:
set ansi_nulls on
go
set quoted_identifier on
go
create function dbo.is_new_customer (
@ultimate_parent_number nvarchar(255),
@existing_customer_begin_date date,
@existing_customer_end_date date
)
returns int
as
begin
declare @return int
set @return = (
case
when not exists (
select
t1.customer_number
from orders_table as t1
inner join (
select
customer_number
from customers_table
where ultimate_parent_number = @ultimate_parent_number
) as t2
on t2.customer_number = t1.customer_number
where t1.order_date between @existing_customer_begin_date
and @existing_customer_end_date
)
then 1
else 0
end
)
return @return
end
go
インラインスカラー関数を呼び出すのではなく、呼び出しクエリの再帰的なCTEに結合する方が効率的です。 –