1

我试图找到我的问题的答案,但找不到类似的例子。

我有这样一个查询的结果

SELECT * FROM (
   SELECT id FROM table
) AS t1

现在我想将 t1 加入到它自己的另一个实例中,因为我需要移动它。例如,如果我想将一行与前一行进行比较。我试过:

SELECT * FROM (
   SELECT id FROM table
) AS t1
LEFT JOIN t1 AS t2 ON (my conditions)

但我收到一个错误,即 t1 是无效的对象名称。当我复制我的选择语句时:

SELECT * FROM (
   SELECT id FROM table
) AS t1
LEFT JOIN (
   SELECT id FROM table
) AS t2 ON (my conditions)

以上工作,但它不比加入已经返回的结果慢吗?

任何帮助,将不胜感激

4

2 回答 2

3

第一个是正确的:

SELECT * FROM (
   SELECT id FROM table
) AS t1
LEFT JOIN t1 AS t2 ON (my conditions)

因为你不能给别名起别名。您可以使用 CTE 执行类似的操作,如下所示:

;WITH cte
AS
(
    SELECT * FROM Table   
)
SELECT *
FROM Cte t1
INNER JOIN cte t2 ON --
于 2012-10-03T11:07:46.263 回答
3

我认为您的选择应该是以下形式:

SELECT * 
FROM [table] t1
LEFT JOIN [table] t2 ON (your conditions)

从性能的角度来看,这与您上一次选择和Mahmoud 回答中的 CTE 解决方案相同(我已经查看了 SQL Server 中所有三个的执行计划)。

这可能只是一个品味问题,但我发现这种形式更具可读性/可维护性。

于 2012-10-03T11:14:53.920 回答