2015-05-19 2 views
5

Il seguente post aveva validi motivi per evitare generalmente l'uso di select * in SQL.Best Practice: selezionare * su CTE

Why is SELECT * considered harmful?

Nella discussione è stato esempi di quando era o non era accettabile per usare select * Tuttavia non mi sembra discussione sul espressione di tabella comune (CTE). Ci sono degli svantaggi nell'uso di select * in CTE?

Esempio:

WITH CTE1 AS 
(
    SELECT Doc, TotalDue 
    FROM ARInvoices 
    WHERE CustomerName = 'ABC' 
    UNION 
    SELECT Doc, - TotalDue 
    FROM ARInvoiceMemos 
    WHERE CustomerName = 'ABC' 
) 

select * from CTE1 
UNION 
Select 'Total' as Doc, sum(TotalDue) 
FROM CTE1 
+0

Credo che lo stesso caso valga per le CTE per gli stessi motivi indicati nella domanda che hai collegato. Non riesco a trovare alcun documento per dimostrarlo. –

+4

Qui non c'è alcun inconveniente. Lo stesso vale per le tabelle derivate 'select * from (select a, b, c from some_table) as t' –

risposta

2

Dal momento che già correttamente elencato i nomi delle colonne nel cte, non vedo alcun danno nel usando select * dal cte.
In effetti, potrebbe essere proprio il posto giusto per utilizzare select *, poiché non c'è motivo di elencare le colonne due volte.
A meno che non sia non è necessario utilizzare tutte le colonne restituite da cte. (Ad esempio, una colonna nel cte viene utilizzata nella query, ma non nella clausola select). In tal caso, suggerirei di elencare solo le colonne di cui si ha bisogno anche di from punta a cte.

Si noti che se lo stesso cte utilizza select *, vengono applicati tutti gli svantaggi elencati nel post collegato.

La mia obiezione principale a select * è che viene solitamente utilizzata dagli sviluppatori pigri che non considerano le conseguenze dello *.

Nota: Tutto ciò che ho scritto qui si applica anche alle tabelle derivate.

2

In teoria si applica sempre la regola empirica a select *. In pratica però, se sei uno sviluppatore che considera cose come la progettazione e la pratica di programmazione generale importanti quanto la funzionalità, il tuo CTE sarà probabilmente codificato per restituire solo le colonne effettivamente necessarie, quindi select * from CTE1 potrebbe non essere così male.