以下帖子有令人信服的理由通常避免在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
答案 0 :(得分:3)
由于您已经在cte
中正确列出了列名称,因此select *
使用cte
时没有任何损害。
实际上,它可能只是使用select *
的正确位置,因为没有必要将列列出两次。
除非,否则您不需要使用cte
返回的所有列。 (即cte
中的一列用于查询,但不用于select
子句中。在这种情况下,我建议只列出你需要的列,即使from指向一个{ {1}}。
请注意,如果cte
本身使用cte
,则您链接的帖子中列出的所有缺点都适用于此。
我对select *
的主要反对意见是,懒惰的开发人员通常会使用它,而不考虑select *
的后果。
注意:我在这里写的所有内容也适用于派生表。
答案 1 :(得分:2)
理论上,select *
不明智的经验法则始终适用。
在实践中,如果您是一名开发人员,他认为设计和一般良好的编程实践与功能一样重要,那么您的CTE很可能只会被编码为仅返回实际需要的列,因此select * from CTE1
可能不是那么糟糕。