2

今天我们发现了 SQL Server 2012 SP1 的一些奇怪行为。我们知道如何重现问题,但我们不确定是什么原因造成的。这是一个非常笼统的例子:


假设您有一个数据库 test,它有一个表 table1,其中包含以下数据:

column1
-
1
2
3
4

您运行以下查询:

USE [test]

SELECT [column1]
FROM [test].[dbo].[table1]
WHERE [column1] IN
(SELECT TOP 5 [column1]
FROM [table1])

正如预期的那样,返回 5 行。现在运行以下查询:

USE [test]

SELECT [column1]
FROM [test].[dbo].[table1]
WHERE [column1] IN
(SELECT TOP 5 [test].[dbo].[table1].[column1]
FROM [table1])

这次返回 10 行,即使SELECT TOP 5 [test].[dbo].[table1].[column1] FROM [table1]返回 5 行。


查看执行计划,我可以看出服务器正在做不同的事情,但我不知道为什么。

解决方案似乎是确保我们不会无缘无故地过于明确,但既然我们已经遇到了,我们要确保没有人再次导致这种行为。

4

1 回答 1

1

好吧,查询的上下文是造成差异的原因。

在下面的查询中,第二个 select 语句实际上是从第一个表中选择一个列。

SELECT [column1]
FROM [test].[dbo].[table1]
WHERE [column1] IN
(SELECT TOP 5 [test].[dbo].[table1].[column1]
FROM [table1])

如果你给表格一个别名,你会注意到不同的结果:

SELECT [column1]
FROM [test].[dbo].[table1] table1A
WHERE [column1] IN
(SELECT TOP 5 [test].[dbo].[table1].[column1]
FROM [table1])

此外,当您SELECT TOP 5 [test].[dbo].[table1].[column1] FROM [table1]自行运行查询时,不会混淆您从哪个表中选择。

您的查询相当于:

Select column1 from table1
where column1 in 
(select column1)

只要另一个表返回行,您选择的值在子查询中总是等于它自己。这很像说给我集合中的所有内容,当添加到另一个集合时,列值等于它自己。只要另一组不为空,列值将始终等于自身。

于 2013-07-19T18:26:06.833 回答