2016-05-11 87 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查詢。所以我不明白你爲什麼想要這樣做,這首先呢?