2016-05-11 86 views
0

我使用此查询这是不允许的:子查询返回多个值当子查询

select * 
from Master_Shares 
where (PartnerId = (select distinct PartnerId from Master_Shares)) 

这引发错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

+3

这是什么查询应该做的事情?这只是过滤行,对吧?到有PartnerId设置的那些?为什么你不会简单地使用WHERE子句来过滤它们(比如WHERE PartnerId不为空)? –

回答

2

的错误信息,你得到的是不言自明:子查询

select distinct PartnerId from Master_Shares 

返回多个值,因此其结果不是标量并不能与=运营商使用。

你必须使用IN操盘手:

select * 
from Master_Shares 
where PartnerId IN (select distinct PartnerId from Master_Shares) 

附:查询似乎毫无意义,因为它本质上等价于:

select * 
from Master_Shares 

我刚刚离开这个岗位是朝着IN操作者的使用提示。

+1

当使用'IN'时,他不应该需要'DISTINCT',如果SQL Server查询优化器不够聪明以至于忽略它,那么最好不要。 –

+0

@ LasseV.Karlsen是的,这可能是真的。 –

0

你必须使用IN,而不是=,是因为您的错误信息说你的子查询返回多个值,这意味着你不能在以下使用=

select * 
from Master_Shares 
where (PartnerId IN (select distinct PartnerId from Master_Shares)) 
0
select distinct PartnerId from Master_Shares 

这查询将获得Master_Shares表中所有可用的独特PartnerId。

现在,

select * from Master_Shares 
where (PartnerId = (select distinct PartnerId from Master_Shares)) 
WHERE子句中已经使用“=”运算符,它会期望从你的内部查询只有一个值

。您的查询仅适用于您的表中只有一个独特PartnerId的情况,但在您将拥有多个不同PartnerId的情况下,它将失败。

解决方案: -

You can use In clause

select * from Master_Shares 
    where PartnerId in (select distinct PartnerId from Master_Shares) 

但在你的情况

select * from Master_Shares 

也将给予相同的记录为IN查询。所以我不明白你为什么想要这样做,这首先呢?