如何将子查询加入自身?

时间:2017-05-25 03:54:20

标签: sql sql-server tsql subquery

如何将子查询加入到自身中?我想做类似以下的事情。

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 

但是上面的查询给出了错误

  

Msg 208,Level 16,State 1,Line 1   无效的对象名称为“四”。

我宁愿不必首先将它存储为变量或视图等,因为这是整体查询的一部分(这本身就是一个子查询,它是一系列UNIONS的一部分)我不知道我希望确保其他地方没有影响联接。

此更改背后的推动力是four曾经是一个简单的查找,但现在对于此查询,必须计算值。

PS - 这是一个简化示例,在我的情况下,four的子查询是一百行

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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 

答案 2 :(得分: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