T-SQL是否提供了一种简单而非过度设计的方法来减少子查询的代码重复?(无临时表等)

T-SQL是否提供了一种简单而非过度设计的方法来减少子查询的代码重复?(无临时表等),sql,sql-server,tsql,Sql,Sql Server,Tsql,这似乎是SQL的一个主要问题: SELECT A, B, C, ... X, Y, ( SELECT TOP 1 b.R FROM ( SomeHugeSubqueryThatInclduesAWhereClause ) b ORDER BY b.R ) AS Z FROM ( AlmostTheSameSubqu

这似乎是SQL的一个主要问题:

SELECT
    A, B, C,
    ...
    X, Y,
    (
        SELECT TOP 1
            b.R
        FROM (
            SomeHugeSubqueryThatInclduesAWhereClause
        ) b
        ORDER BY
            b.R
    ) AS Z
FROM (
    AlmostTheSameSubqueryThatIncludesAnOnlySlightlyDifferentWhereClause
) a
像这样使用子查询的问题是代码重复。有一些解决方法,包括临时表、存储过程等

这些变通方法至少有一个问题是,它们相对地涉及到一些更通用的语言只需要一行代码就可以实现的事情。其他语言允许您快速添加变量并继续引用它,即使该变量引用的对象有延迟执行迭代器或其他东西

临时表可能会与延迟执行的想法有点冲突。视图、存储过程和函数将为DB模式添加更多内容,并使部署和更新更加复杂。以上所有内容都添加了几行样板代码,让人觉得对一些简单的东西进行了过度的工程设计

所以问题是……有没有一种好的、通用的方法来避免在这种情况下出现代码重复,而不会让人感觉过度设计,并自行添加几行代码?

您可以使用公共表表达式(CTE)来做到这一点。它看起来像这样:

with s as (
      <some huge subquery>
     )
select . . .
       (select top 1 b.r
        from s b
        order by b.r
       ) AS Z
from (select s.*
      from s
      where . . .
     ) a;
您可以使用公共表表达式(CTE)来实现这一点。它看起来像这样:

with s as (
      <some huge subquery>
     )
select . . .
       (select top 1 b.r
        from s b
        order by b.r
       ) AS Z
from (select s.*
      from s
      where . . .
     ) a;

对它被称为公共表表达式(CTE),由
with
关键字引入。CTE只能用于它后面的一个select中。如果需要在“更多选择”中重复使用同一查询,可以使用view保存代码一次,也可以使用TVF(内联函数)接受可以在WHERE中使用的参数clause@sepupic只是澄清一下,可以有多个带有嵌套引用的CTE,但最终结果仅限于一个可能很复杂的CTE,您可能会发现,将其分解成一个内联函数无论如何都是有益的-如果您对SQL.CTE、视图、存储过程、临时表、表变量进行单元测试?是的。它被称为公共表表达式(CTE),由
with
关键字引入。CTE只能用于它后面的一个select中。如果需要在“更多选择”中重复使用同一查询,可以使用view保存代码一次,也可以使用TVF(内联函数)接受可以在WHERE中使用的参数clause@sepupic只是澄清一下,可以有多个带有嵌套引用的CTE,但最终结果仅限于一个可能很复杂的CTE,您可能会发现,将其分解成一个内联函数是有益的——如果您对SQL.CTE、视图、存储过程、临时表、表变量进行单元测试?