Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 顶部和外部应用_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 顶部和外部应用

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

如果我有这样一个查询,外部应用程序是否只应用于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_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
时,这又有什么关系呢?不管匹配的数量多少,这不会强制一次返回吗?对不起,我刚刚编辑了它。这是问题的简化版本。这两个问题我都有订单。我确实检查了执行计划,但我真的不知道顶部应用在哪里。如果可以的话,我会在这里发布一个截图,但我不知道怎么做。