Domanda

Essendo stato bloccato con SQL2000 per troppo tempo, non ho davvero avuto un sacco di esposizione a tavola espressioni comuni.

Le risposte che ho dato qui (# 4.025.380) e qui (# 4.018.793) sono andati contro il flusso, nel senso che non ha utilizzato una CTE.

Mi rendo conto che per la ricorsione sono il Beez Kneez, e ci sono un paio di domande che possono essere notevolmente semplificato dal loro uso, ma a che punto è il loro uso solo frivola? Hanno un grande miglioramento delle prestazioni nel corso di un sottoquery o un join? Fanno il codice davvero semplificare e rendere più gestibile?

In breve, quando è buona norma utilizzare un CTE su una sintassi 'minore'.

È stato utile?

Soluzione

Si dovrebbe in genere utilizzare un CTE nel corso di un subquery normale se:

  • Vostri criteri richiede ricorsione (come avrete notato)
  • Il subquery è grande o complesso
  • La query che contiene è grande o complesso
  • Il subquery viene ripetuto (o almeno le più sottointerrogazioni può essere semplificata effettuando diverse operazioni semplici su una sottoquery comune)

In breve, si fanno domande fanno più leggibile se ben utilizzato.

Altri suggerimenti

Personalmente, una volta ho avuto agio con loro, penso che producono più pulito, il codice più leggibile. A titolo di esempio, confrontare la vostra risposta alla mia # 4.018.793 . Abbiamo sostanzialmente fatto la stessa cosa; Ho usato un CTE e non l'hai fatto.

La tua risposta senza CTE:

SELECT
    course,
    section,
    grade,
    gradeCount
FROM
    table
INNER JOIN
    (SELECT
        grade,
        Max(gradeCount) as MaxGradeCount
    FROM
        table
    ) MaxGrades
    ON  table.grade = MaxGrades.grade
        AND table.gradeCount = MaxGrades.MaxGradeCount
ORDER BY 
    table.grade

La mia risposta con CTE:

;with cteMaxGradeCount as (
    select 
        grade, 
        max(gradeCount) as MaxGradeCount
    from @Test
    group by grade
)
select 
    t.course, 
    t.SECTION, 
    t.grade, 
    t.gradeCount
from cteMaxGradeCount c
inner join @Test t
    on  c.grade = t.grade
        and c.MaxGradeCount = t.gradeCount
order by t.grade

Sono zucchero sintattico, con l'eccezione di query gerarchiche / ricorsive.

Tuttavia, non tutto ciò che può essere fatto in modo ricorsivo dovrebbe essere - la generazione della data tramite CTE ricorsiva era appena meglio di un cursore -. Il trucco tavolo NUMERI scalato molto meglio

CTE produce un risultato più veloce in uno scenario ricorsivo. Il risultato di CTE è ripetutamente utilizzato per ottenere il gruppo di risultati finale. Quindi, dal momento che hai preso la tua clausola where o subquery in CTE, sicuramente sta andando a mostrare un miglioramento delle prestazioni.
Riferimento: http://msdn.microsoft.com/ it-it / library / ms190766 (v = SQL.105) aspx

Solo una nota, in molti scenari, tabelle temporanee dà la migliore prestazione allora CTE anche, così si dovrebbe dare una prova di tabelle temporanee pure.
Riferimento: http: //social.msdn .microsoft.com / Forum / it / Transact-SQL / thread / d040d19d-016e-4a21-bf44-a0359fb3c7fb

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top