最佳实践:在CTE

时间:2015-05-19 15:00:36

标签: sql common-table-expression

以下帖子有令人信服的理由通常避免在SQL中使用select *

Why is SELECT * considered harmful?

在讨论中是使用select *时是否可接受的示例但是我没有看到关于公用表表达式(CTE)的讨论。在CTE中使用select *有什么缺点吗?

示例:

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

2 个答案:

答案 0 :(得分:3)

由于您已经在cte中正确列出了列名称,因此select *使用cte时没有任何损害。 实际上,它可能只是使用select *的正确位置,因为没有必要将列列出两次。
除非,否则您不需要使用cte返回的所有列。 (即cte中的一列用于查询,但不用于select子句中。在这种情况下,我建议只列出你需要的列,即使from指向一个{ {1}}。

请注意,如果cte本身使用cte,则您链接的帖子中列出的所有缺点都适用于此。

我对select *的主要反对意见是,懒惰的开发人员通常会使用它,而不考虑select *的后果。

注意:我在这里写的所有内容也适用于派生表。

答案 1 :(得分:2)

理论上,select *不明智的经验法则始终适用。

在实践中,如果您是一名开发人员,他认为设计和一般良好的编程实践与功能一样重要,那么您的CTE很可能只会被编码为仅返回实际需要的列,因此select * from CTE1可能不是那么糟糕。