Ich habe eine Neugier. Bitte schlage mir hier die Best Practices vor.Self-Join-Tabellen vs cte Rekursion
Ich habe eine Tabelle Test, der empname und mgr_name Spalten enthält, wie der Name vorschlagen empname enthält empname und mgr_name enthält Manager-Name für den bestimmten Mitarbeiter. Meine Anforderung besteht darin, diejenigen Mitarbeiter zu finden, die mindestens einem Manager und Mitarbeitern, die Manager sind, Bericht erstatten.
Ich schreibe eine Abfrage und die richtigen Datensätze zurückgibt.
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)
query:
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
Ich habe versucht, diese Abfrage zu optimieren und CTE zu verwenden, anstatt Tabellen in Self-Join der Verwendung mehrerer Zeiten wie
;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
Aber ich fand, dass es keine Besserung zeigt im Ausführungsplan.
Ich brauche Ihre Hilfe, um zu entscheiden, die Abfrage in diesem Fall zu optimieren, bitte schlagen Sie vor, wenn ein anderer Ansatz in diesem Fall optimiert wäre.
** wollen [Schlechte Gewohnheiten treten: im alten Stil mit JOIN] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits -zu-kick-using-old-style-joins.aspx) ** – Sami
Ohne die Pläne, STATS IO und DDL dieser Ansätze zu teilen, wie können wir helfen? –
* Warum * dachtest du, dass die Einführung eines CTE hier helfen würde? –