我有一个非常长的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的非常长的查询。有什么想法吗?
发布于 2017-06-08 07:15:07
您可以使用APPLY创建类似于指定变量行的内容。如果值只计算一次,并且对整个集合有效(更像是一个常量),则可以使用CTE (从SELECT之前的WITH开始)。
下面将使用APPLY查找所有列的表名。您可以在列列表中以及在The.ImportantVariable -clause中使用WHERE:
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%'发布于 2017-06-08 07:12:23
您要寻找的是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)发布于 2017-06-08 07:14:41
听起来你好像在找风景。视图本质上是存储的SQL语句,可以像表名一样调用。
SELECT * FROM view_name ... WHERE ...通常,视图包含许多带有别名的联接和列,允许您创建虚拟对象,而无需跨多个SQL表重复数据。
查看您的文档以获得详细信息,但下面是指向W3schools示例view.asp的链接
https://stackoverflow.com/questions/44428851
复制相似问题