Sql server 顶部和外部应用
如果我有这样一个查询,外部应用程序是否只应用于tblA的前5行?或者,它将应用于从tblA返回的所有行,只有到那时,前5名才适用?我在tblA中有很多行,我不希望外部应用程序在所有行上运行Sql server 顶部和外部应用,sql-server,sql-server-2012,Sql Server,Sql Server 2012,如果我有这样一个查询,外部应用程序是否只应用于tblA的前5行?或者,它将应用于从tblA返回的所有行,只有到那时,前5名才适用?我在tblA中有很多行,我不希望外部应用程序在所有行上运行 SELECT TOP 5 ACol1, ACol2, b.BCol2 FROM tblA OUTER APPLY (SELECT TOP 1 BCol2 FROM tblB WHERE BCol1 = tblA.ACol1 ORDER BY ins_dti
SELECT TOP 5 ACol1, ACol2, b.BCol2
FROM tblA
OUTER APPLY (SELECT TOP 1 BCol2
FROM tblB WHERE BCol1 = tblA.ACol1
ORDER BY ins_dtim DESC) b
ORDER BY tblA.ACol3
首先,任何使用
TOP
而没有匹配的orderby
的行为都很可能是错误的。这适用于现有查询的两部分:TOP1
和TOP5
语句
顺便说一下,对于这个查询,您最好这样:
SELECT TOP 5 ACol1, ACol2, MAX(b.BCol2) AS BCol2
FROM tblA a
LEFT JOIN tblB b ON b.BCol1 = a.ACol1
GROUP BY a.ACol1, a.ACol2
只要ACol1
和ACol2
是合理唯一的,它应该和您拥有的一样有效。如果您的表中存在重复的ACol1、ACol2
对,那么您现在拥有的可能会允许重复的ACol1、ACol2对。这是不可能的。但由于您不关心顺序,因此如果返回不同的值,只要它们与表中的实际数据匹配,您就没有理由抱怨
但我明白所有这些也可能是问题的简化版本,因此我将用两种方式直接解决这个问题
首先,当你对行为不清楚时,正确的做法是检查执行计划。你不需要是一个执行计划专家来决定发生了什么。如果您不熟悉每个节点的含义,谷歌可以帮助您理解它
从另一个角度来看,不要引用我的话,但我希望SQLServer在这种特定情况下只使用5次。我想这就是你希望听到的但在一般情况下不要指望这一点。
如果查询中有一个ORDER BY
子句(无论何时使用TOP
),则Sql Server在检查所有可能性之前无法知道返回哪些结果。此外,如果应用结果中的任何字段确定了排序依据,Sql Server肯定必须对每个可能的记录运行子查询。否则,它将无法知道需要哪些记录
最后,在许多情况下,查询优化器将APPLY
处理为比子查询更类似于JOIN
。即使它似乎需要计算每条记录的结果,它也可能比您预期的要快。我发现将首先在所有行上执行外部应用,然后返回前5行。外部应用
返回catersian产品,但如果从锚中找不到匹配项,也将返回0,简而言之,它将返回前5名结果中的前1名。。。。简化outer apply
类似于select语句中的子查询字段
,但区别在于子查询只能返回1个字段。也许查看查询计划会告诉您?如果您正在执行TOP 1
以限制outer apply
的正确表表达式,为什么不执行左加入
?@NetMage,因为来自tblB的超过记录可能与tblA匹配。虽然在这种情况下,可能需要一个附加的GROUP BYbetter@JoelCoehoorn但是,当子查询中有TOP 1
时,这又有什么关系呢?不管匹配的数量多少,这不会强制一次返回吗?对不起,我刚刚编辑了它。这是问题的简化版本。这两个问题我都有订单。我确实检查了执行计划,但我真的不知道顶部应用在哪里。如果可以的话,我会在这里发布一个截图,但我不知道怎么做。