我正在尝试运行此查询,因为我正在使用
连接需要很长时间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
之类的操作。
我还有其他办法吗?
答案 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 Apply
和T1.Id = TT.Id
,因为T1是父表加上按顺序添加 - 如果有序结果集需要
答案 2 :(得分:0)
首先,您的派生表将产生非确定性结果,因为每次运行它时返回的前1行可能会有所不同,即使表中的数据保持不变也是如此。您可以在派生表中放置order by子句以防止这种情况发生。
Table1.id上有索引吗?你究竟想要实现的目标是,从Table1中返回所有行,只有一行来自Table2的具有相同ID的行?
如果是这样,我会考虑使用Cross Apply。或者在这种情况下可能是外部申请。如果我稍后有机会,如果需要,我会写一个例子,但同时只是Google Outer申请SQL Server。
丹