Pan*_*sis 1 sql t-sql sql-server
这似乎是SQL的主要问题:
SELECT
A, B, C,
...
X, Y,
(
SELECT TOP 1
b.R
FROM (
SomeHugeSubqueryThatInclduesAWhereClause
) b
ORDER BY
b.R
) AS Z
FROM (
AlmostTheSameSubqueryThatIncludesAnOnlySlightlyDifferentWhereClause
) a
Run Code Online (Sandbox Code Playgroud)
使用这样的子查询的问题是代码重复.有一些解决方法,包括临时表,存储过程等.
这些变通办法至少有一个问题是它们相对涉及更通用的语言只需要一行代码的东西.其他语言允许您快速添加变量并保持引用它,即使变量引用的对象具有延迟执行迭代器等.
临时表可能与延迟执行的想法有点争论.视图,存储过程和函数将为数据库模式添加更多内容,并使部署和更新变得更加复杂.以上所有内容都添加了几行样板代码,只是觉得过于简单的过度工程.
所以问题是......在这样的情况下,是否有一种好的,通用的方法可以避免代码重复,而不会有一些感觉过度设计并且自己添加几行的东西?
您可以使用公用表表达式(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;
Run Code Online (Sandbox Code Playgroud)
但是,您可以使用窗口函数执行您想要的操作:
select s.*
from (select s.*, min(b.r) over () as min_r
from s
) s
where . . .;
Run Code Online (Sandbox Code Playgroud)