Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SELECT SQL语句声明要在WHERE子句中使用的变量_Sql_Sql Server - Fatal编程技术网

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

使用SELECT SQL语句声明要在WHERE子句中使用的变量,sql,sql-server,Sql,Sql Server,我有一个非常长的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 FR

我有一个非常长的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...) ....
这个重要变量本身就是一个很长的查询。但是,它用于同一查询的其他部分,包括WHERE子句和内部JOIN子句。我的问题是,如何保存它的值,这样我就不必每次都编写整个查询了。在上面的示例中,我希望键入a.columnname=Importantvariable,而不是整个查询。我尝试使用DECLARE并将值保存在已声明的变量中,但它不允许我这样做,出现以下错误:

A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operation.
当然,这是有道理的,但我的重点是执行数据检索,我只是不想复制和粘贴在查询中几个不同位置定义重要变量的很长的查询。
有什么想法吗?

您正在寻找的是Microsoft SQL Server的通用表表达式CTE

您可以在此处阅读有关它们的信息:

你所做的是

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

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

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

请查看您的文档以了解详细信息,但这里有一个指向W3schools示例的链接

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

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

更新比较CTE并应用 检查这个!CTE提供的一行中有一些常量值,可以交叉连接到查询中并用作命名常量


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

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;

如果这个查询与外部查询不相关,我的意思是,如果它不依赖外部选择的值,那么您可以在一个类似于我所寻找的查询中使用它。但是,您可以在内部联接中使用应用的变量吗?现在正在测试…@mmvsbg,是的,但是连接必须出现在APPLYWell之后,然后交叉应用最终成功了,但是你的回答为我指明了正确的方向。非常感谢@mmvsbg交叉应用和外部应用大致相同,但其行为类似于内部连接和左连接,如果在任何情况下都会产生结果,则不会产生任何差异。但是如果-对于某些行-结果可能是空的结果集,交叉应用将超过整行…是的,谢谢,我现在知道我在寻找什么了。最后在我的情况下使用了一些交叉应用和一些外部应用语句。再次感谢!
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 ....
;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;