2017-05-25 58 views
1

你怎么能加入一个子查询本身?我想要做如下的事情。如何将子查询加入自己?

SELECT 
    four.src AS start, four.dest AS layover, f.dest AS destination 
FROM 
    (SELECT 1 AS src, 2 as dest union all select 2, 3) AS four 
JOIN 
    four AS f 
ON f.src = four.dest 

但是上面的查询给我的错误

消息208,级别16,状态1,行1 无效对象名 '四'。

我宁愿没有将其保存为一个变量或查看等第一,因为这是一个整体的查询的一部分(这本身就是一个子查询等一系列UNIONS其一部分),我不想以确保在其他地方没有影响联系。

这个变化背后的力量是four曾经是一个简单的查找,但现在这个查询的值必须计算。


PS - 这是一个简单的例子,在我来说,我four子查询是几百行代码

回答

3

您可以使用CTE在这种情况下。在这里,您不需要将此结果存储在任何临时对象中。

;WITH four AS (
SELECT 1 AS src, 2 as dest 
union all 
select 2, 3 
) 

SELECT F1.src AS start, F1.dest AS layover, f2.dest AS destination 
FROM four F1 
INNER JOIN four F2 ON F1.src = F2.dest 
0

您需要重新编写一次。你的别名'四'只能在'选择','在','有','在'等方面被调用。仅作为条件,并且不作为连接中的表格,除非它本身是表格名称

SELECT 
    four.src AS start, four.dest AS layover, f.dest AS destination 
FROM 
    (SELECT 1 AS src, 2 as dest union all select 2, 3) AS four 
JOIN 
    (SELECT 1 AS src, 2 as dest union all select 2, 3) AS f 
ON f.src = four.dest 
0

使用临时表。

Declare @Temp(src int, desc int); 
INSERT INTO @Temp(src,desc) 
VALUES 
(SELECT 1 AS src, 2 as dest union all select 2, 3) 
SELECT * FROM @Temp t1 
INNER JOIN @Temp t2 ON t1.src = t2.dest 
+0

>我宁愿不必将它作为变量存储 – ArtB