我收到“子查询返回的值超过1”,而我的SELECT上没有子查询

时间:2019-02-06 04:48:41

标签: sql sql-server

我有一个视图,在该视图中我无权对其进行修改,并且我必须进行SELECT查询,该查询使我的行中的列为空(空,不为null)

在这种情况下,我有:

Oid| Name | Email | Phone 

此视图上的总记录超过980,000行。

这是我尝试过的:

SELECT DISTINCT * FROM View WHERE Phone = '' 

SELECT DISTINCT * FROM View  WHERE datalength(Phone)<1

SELECT DISTINCT * FROM View  WHERE Len(Phone)<1

在所有这些错误中,我都会得到错误:

[Err] 21000 - [SQL Server]Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

如果我进行选择而不尝试获取“电话”中的空行,那么我也尝试检查某些Oid是否重复:

SELECT
    Oid, COUNT(*)
FROM
    View
GROUP BY
    Oid
HAVING 
    COUNT(*) > 1

但是我没有结果(没有重复)

有趣的是,如果我制作了TOP 1000(在电话中找到空白),它可以工作,所以我不知道发生了什么。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

正如评论所暗示的,这里的问题将在视图中。可能不会立即显而易见的是,从视图中读取的执行计划可能会根据您所应用的条件而千差万别。在这种情况下,我假设Phone是由子查询生成的。该视图将假定子查询仅返回一行。如果在没有电话的情况下查询视图,则子查询将永远不会执行。

如果需要电话,则会执行子查询,从而导致错误。

尝试在打开执行计划的情况下运行它们,这应该有助于您了解问题所在。

这是您可以充分利用的功能,我经常使用它来有条件地依赖于依赖于参数的表进行连接。