将所选列连接到表

时间:2014-03-12 14:14:06

标签: sql sql-server sql-server-2008-r2

我正在尝试运行此查询,因为我正在使用

连接需要很长时间
SELECT T1.Id,T2.T2Id,T2.Col2
FROM Table1 T1
    LEFT OUTER JOIN (SELECT TOP 1 Id, TT.T2Id,TT.Col2
                    FROM Table2 TT
                    WHERE TT.TypeId=3
                    ORDER BY TT.OrderId
                    )AS T2 ON T2 .Id=T1.Id

事情是,它不允许我在联接查询中执行TT.Id=T1.Id之类的操作。

我还有其他办法吗?

3 个答案:

答案 0 :(得分:2)

使用outer apply

进行尝试
SELECT T1.Id, T2.T2Id, T2.Col2
FROM Table1 T1
OUTER APPLY (SELECT TOP 1 T2Id, T2.Col2
             FROM Table2 TT
             WHERE TT.TypeId = 3 AND TT.Id = T1.Id) T2

答案 1 :(得分:1)

SELECT T1.Id, T2.T2Id, T2.Col2
FROM Table1 T1
OUTER APPLY (SELECT TOP 1 T2Id, T2.Col2
             FROM Table2 TT
             WHERE TT.TypeId = 3 AND T1.Id = TT.Id
             Order by  T2id desc) T2

我会在where条件中使用Outer ApplyT1.Id = TT.Id,因为T1是父表加上按顺序添加 - 如果有序结果集需要

答案 2 :(得分:0)

首先,您的派生表将产生非确定性结果,因为每次运行它时返回的前1行可能会有所不同,即使表中的数据保持不变也是如此。您可以在派生表中放置order by子句以防止这种情况发生。

Table1.id上有索引吗?你究竟想要实现的目标是,从Table1中返回所有行,只有一行来自Table2的具有相同ID的行?

如果是这样,我会考虑使用Cross Apply。或者在这种情况下可能是外部申请。如果我稍后有机会,如果需要,我会写一个例子,但同时只是Google Outer申请SQL Server。