最佳实践: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
可能还不错。
以下 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
可能还不错。