最佳实践:Select * 关于 CTE

Best Practice: Select * on CTE

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

Why is SELECT * considered harmful?

讨论中有关于何时接受或不接受 table 使用 select * 的示例,但是我没有看到关于通用 table 表达式 (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

由于您已经在 cte 中正确列出了列名,我认为使用 cte 中的 select * 没有任何危害。
事实上,它可能是使用 select * 的正确位置,因为没有必要列出两次列。
除非您不需要使用cte返回的所有列。 (即 cte 中的一列用于查询,但不用于 select 子句)在这种情况下,我建议只列出您需要的列,即使 from 指向 cte.

请注意,如果 cte 本身使用 select *,那么您链接到的 post 中列出的所有缺点都适用于它。

我对 select * 的主要反对意见是,它通常被不考虑 *.

后果的懒惰开发人员使用

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

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

但在实践中,如果您是一名开发人员,认为设计和一般良好的编程实践与功能一样重要,您的 CTE 很可能只编码到 return 实际需要的列,所以 select * from CTE1 可能还不错。