2016-05-11 12 views
0

ich diese Abfrage verwenden:Unterabfrage gab mehr als 1 Wert Dies ist nicht zulässig, wenn die Unterabfrage

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

Dieser den Fehler wirft:

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

+3

Was soll diese Abfrage tun? Es filtert einfach die Zeilen, richtig? Zu denen, die PartnerId gesetzt haben? Warum werden Sie nicht einfach die WHERE-Klausel verwenden, um sie herauszufiltern (wie WHERE PartnerId ist nicht null)? –

Antwort

2

Die Fehlermeldung, die Sie erhalten, ist selbsterklärend : dass die Unter

select distinct PartnerId from Master_Shares 

kehrt mehr als ein Wert, daher ist ihr Ergebnis nicht Skalar und kann nicht mit dem Operator = verwendet werden.

Sie haben stattdessen IN Operator verwenden:

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

P. S. Die Abfrage scheint sinnlos, da es im Wesentlichen gleichwertig ist:

select * 
from Master_Shares 

Ich lasse gerade diesen Beitrag als Hinweis auf die Nutzung des IN Betreiber.

+1

Bei der Verwendung von 'IN' sollte er auch nicht 'DISTINCT' benötigen, es ist wahrscheinlich besser ohne, wenn der SQL Server-Abfrageoptimierer nicht intelligent genug ist, um es zu ignorieren. –

+0

@ LasseV.Karlsen Ja, das ist wahrscheinlich wahr. –

0

Sie haben IN statt = zu verwenden, dass, weil die Unterabfrage mehr als 1 Wert zurück als Fehlermeldung sagt, das ist meine nicht Sie = in folgenden verwenden:

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

Diese Query wird Ihnen alle verschiedenen PartnerId in der Tabelle Master_Shares zur Verfügung stellen. Jetzt

,

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

in Where-Klausel Sie verwendet haben '=' Operator, der nur einen Wert von Ihrer inneren Abfrage erwarten wird. Ihre Abfrage funktioniert nur in dem Fall, in dem nur eine eindeutige Partner-ID in Ihrer Tabelle vorhanden ist, aber in dem Fall, in dem Sie mehrere unterschiedliche Partner-IDs haben, schlägt sie fehl.

Lösung: -

You can use In clause

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

Aber in Ihrem Fall

select * from Master_Shares 

auch denselben Datensatz geben, wie IN-Abfrage. Also verstehe ich nicht, warum Sie das auf diese Weise an erster Stelle machen wollen?

Verwandte Themen