使用 SELECT SQL 语句声明要在 WHERE 子句中使用的变量



我有一个很长的SQL语句,它有以下框架(使用SQL Server 2005):

SELECT
a.something AS Something,
b.otherthing AS Otherthing,
(SELECT another FROM ... WHERE...) AS Importantvariable,
....
FROM...
INNER JOIN...
INNER JOIN...
WHERE a.columnname = (SELECT another FROM ... WHERE...) ....

Importantvariable本身是一个非常长的查询。但是,它用于同一查询的其他部分,包括WHERE子句和INNER JOIN子句。我的问题是,如何以某种方式保存它的值,这样我就不必每次都编写整个查询。在上面的这个例子中,我想键入a.columnname = Importantvariable而不是整个查询。我尝试使用DECLARE并将值保存在声明的变量中,但它不允许我这样做,并出现以下错误:

A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operation.

当然,这是有道理的,但我的全部观点是执行数据检索,我只是不想在查询中的几个不同位置复制和粘贴定义Importantvariable的很长的查询。 有什么想法吗?

您可以使用APPLY创建类似命名变量的内容。如果该值计算一次并且对整个集合有效(更像是一个常量),则可以使用CTE(在SELECT之前以WITH开头)。

以下内容将使用APPLY来查找所有列的表名称。您可以在列列表中以及WHERE-子句中使用The.ImportantVariable

SELECT The.ImportantVariable
,c.*
FROM sys.columns AS c
OUTER APPLY(SELECT name FROM sys.objects AS o WHERE c.object_id=o.object_id) AS The(ImportantVariable)
WHERE The.ImportantVariable LIKE 'a%';

更新 比较 CTE 并应用

检查这个!CTE 提供的1 个单行中有一些常量值,您可以将其CROSS JOIN到查询中并用作命名常量

WITH SomeConstants AS
(
SELECT 'I''m a constant value' AS Constant1 --might be a complex statement too!
,0 AS Constant2
)
SELECT The.ImportantVariable
,Constant1
,Constant2
,c.*
FROM SomeConstants
CROSS JOIN sys.columns AS c
OUTER APPLY(SELECT name FROM sys.objects AS o WHERE c.object_id=o.object_id) AS The(ImportantVariable)
WHERE The.ImportantVariable LIKE 'a%'

您要查找的是Microsoft SQL Server的公用表表达式(CTE)

您可以在此处阅读有关它们的信息: https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx

你所做的是

WITH (columns)
AS (query)
SELECT (another query using (possibly many times) the previous query)

听起来你正在寻找一个视图。视图本质上是一个存储的 SQL 语句,可以像表名一样调用。

SELECT​ * FROM view_name ... WHERE ...

通常,视图包含许多联接和带有别名的列,允许您创建虚拟对象,而无需跨多个 SQL 表复制数据。

查看您的文档以了解详细信息,但这里是 W3schools 示例的链接 https://www.w3schools.com/sql/sql_view.asp

使用外部或交叉应用。它使您的查询更具可读性,并且可能更快。

SELECT
a.something AS Something,
b.otherthing AS Otherthing,
Importantvariable,
....
FROM...
INNER JOIN...
INNER JOIN...
outer apply (SELECT another  AS Importantvariable FROM ... WHERE...)
WHERE a.columnname = Importantvariable ....

我建议像这样使用CTE:

;with cte as
(
SELECT
a.something AS Something,
b.otherthing AS Otherthing,
(SELECT another FROM ... WHERE...) AS Importantvariable,
....
FROM...
INNER JOIN...
INNER JOIN...
)
select *,
<maybe more uses of Importantvariable>
from cte
WHERE columnname = Importantvariable;

最新更新