首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >声明在WHERE子句中使用SELECT SQL语句的变量

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

Stack Overflow用户
提问于 2017-06-08 07:05:52
回答 5查看 1.2K关注 0票数 2

我有一个非常长的SQL语句,它具有以下框架(使用SQL server 2005):

代码语言:javascript
复制
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并将值保存在一个声明的变量中,但是它不允许我这样做,因为有以下错误:

代码语言:javascript
复制
A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operation.

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-06-08 07:15:07

您可以使用APPLY创建类似于指定变量行的内容。如果值只计算一次,并且对整个集合有效(更像是一个常量),则可以使用CTE (从SELECT之前的WITH开始)。

下面将使用APPLY查找所有列的表名。您可以在列列表中以及在The.ImportantVariable -clause中使用WHERE

代码语言:javascript
复制
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到查询中并作为命名常量使用。

代码语言:javascript
复制
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%'
票数 3
EN

Stack Overflow用户

发布于 2017-06-08 07:12:23

您要寻找的是Microsoft SQL Server的公共表表达式(CTE)

你可以在这里读到它们:https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx

你所做的就是

代码语言:javascript
复制
WITH (columns)
AS (query)
SELECT (another query using (possibly many times) the previous query)
票数 0
EN

Stack Overflow用户

发布于 2017-06-08 07:14:41

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

代码语言:javascript
复制
SELECT​ * FROM view_name ... WHERE ...

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

查看您的文档以获得详细信息,但下面是指向W3schools示例view.asp的链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44428851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档