0

我正在查询 SQL Server 2012。

我在一个大型结果集上有一个左外连接,如下所示:

Data
LEFT OUTER JOIN
(
    SELECT
        MemberID
        ,MIN(Date)
    FROM
        Tables
    GROUP BY
        MemberID
) T
ON Data.MemberID = T.MemberID

其中 Data 已经是一个大型查询(返回数万行)。

我的问题是:这个嵌套选择查询是否仅针对我在“数据”中已有的 MemberID 进行评估?这似乎已经大大减慢了存储过程的速度,有没有更标准的方法来做到这一点?或者这只是意料之中的事?

提前致谢。

4

2 回答 2

1

不,对所有行评估子查询。

如果你想要第一行的东西,那么做:

row_number() over (partition by Memberid order by Date) as seqnum

然后使用:

where seqnum = 1
于 2014-11-04T14:57:05.070 回答
0

最后我使用 Gordon Linoffs 方法选择第一行,然后在嵌套的 select 语句中将 Left Outer Join 更改为 Outer Apply with WHERE 条件

Data.MemberID = Tables.MemberID

这大大提高了速度。请注意,原始问题的查询版本非常简化,因此此解决方案可能并非在所有情况下都适用。

于 2014-11-04T17:01:36.563 回答