私は好奇心を持っています。ここにベストプラクティスを教えてください。自己結合表とcteの再帰
empnameにはempnameとmgr_nameの列が含まれ、empnameにはempnameが含まれ、mgr_nameには特定の従業員のマネージャ名が含まれていることがわかります。私の要件は、少なくとも1人のマネージャー+マネージャーである従業員に報告する従業員を見つけることです。
私はクエリを書き、正しいレコードを返しています。
create table test(empname varchar(10),mgr_name varchar(10))
insert into test
values('a','b'),('b',null),('c',null),('d','f'),('f',null),('g',null),('h',null)
クエリ:私はこのクエリを最適化し、代わりに自己のテーブルを使用してのCTEを使用しようとした
select a.empname
from test a , test b
where a.mgr_name =b.empname
union
select b.empname
from test a , test b
where a.mgr_name =b.empname
が
;with cte as (
select *
from test
)
select a.empname
from cte a , cte b
where a.mgr_name =b.empname
union
select b.empname
from cte a , cte b
where a.mgr_name =b.empname
のように複数回参加しかし、私は何の改善がないことがわかりました実行計画に表示されます。
この場合、クエリを最適化することを決定するために助けが必要です。他のアプローチがこの場合最適化されるかどうかをご提案ください。あなたはまだ2回の走査を行うが、のを取得する必要があります
SELECT empname
FROM test
WHERE mgr_name IS NOT NULL
UNION
SELECT mgr_name
FROM test
WHERE mgr_name IS NOT NULL;
:
**たいクエリの[悪い習慣を蹴るためには:古いスタイルを使用してJOINを](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habitsどのように私たちが手助けすることができますこれらのアプローチの計画、STATSのIOとDDLを共有しないで - 蹴って - 古いスタイルのjoins.aspxを使用していますか? – Sami
? –
*なぜCTEを導入することがここで助けになると思いましたか? –