如何避免两次编写 SQL Server 查询以避免重复?

Posted

技术标签:

【中文标题】如何避免两次编写 SQL Server 查询以避免重复?【英文标题】:How do I avoid writing a SQL Server query twice to avoid duplication? 【发布时间】:2012-01-24 18:58:11 【问题描述】:

我有一个 sql 查询,需要在整个查询中多次重复相同的 SELECT 语句作为其他计算的输入。

如何编写查询以便只定义重复的SELECT SQL 语句一次?有没有一种方法可以避免在通过查询重复时出错?

更新: 在这种情况下,从 SELECT 返回的数据预计在 80% 的情况下小于 100 行,在其他 20% 的情况下最多为 100-200 行

CTE 和表格变量看起来都是有效的答案 - 但您如何知道在任何情况下哪个选项更合适?

【问题讨论】:

@ypercube - CTE 在这里不太合适,因为它只适用于一个查询。一旦我SELECT * FROM CTE 下一个查询看不到它,除非我重新定义 CTE 哪种违背了目的:) @JNK:在这种情况下,视图可能会很方便。我认为 OP 想在同一个查询中多次使用同一个 SELECT。 他可能是,这不是很清楚。 @ypercube:你是对的——我想在同一个查询中多次重复使用同一个 SELECT,所以 CTE 非常适合。如果您将您的建议添加为实际答案,我会将其标记为正确的。谢谢! 【参考方案1】:

使用选择插入临时表或表变量。 (如果您认为数据集很小,请使用表变量,如果数据集很大,请使用临时表)。然后在所有后续查询中加入临时表或表变量,就像任何其他表一样。

【讨论】:

其他注意事项 - 临时表可以被索引并具有约束,而哪些变量不能。临时表在内部范围内也是可见的,而表变量仅在直接范围内可见。 不过,表变量对于 tempdb 锁定和并发问题的可能性确实较小。这并不总是一个明确的选择。【参考方案2】:

如果您想在同一个查询中多次重复使用相同的SELECT 作为子查询,那么您可以使用Common Table Expressions (CTE)

【讨论】:

以上是关于如何避免两次编写 SQL Server 查询以避免重复?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在 SQL Server 中重复插入动态值

如何避免 BigQuery 中的 Power BI 增量刷新重复查询?

避免 SQL Server 中的 while 循环

使用 TypeScript 时如何避免两次编写 Mongoose 的 Schema?

如何编写查询以避免在 select distinct 和 size collect_set hive 查询中使用单个 reducer?

优化 SQL 查询以避免全表扫描