2013-04-17 15 views
11

Ich habe eine gespeicherte Prozedur, die select * from book table verwendet, Unterabfrage meine Abfrage istUnterabfrage hat mehr als 1 Wert zurückgegeben. Dies ist nicht zulässig, wenn die Unterabfrage =,! =, <,<=,>,> = oder wenn die Unterabfrage als Ausdruck verwendet wird

USE [library] 
GO 

/****** Object: StoredProcedure [dbo].[report_r_and_l] Script Date: 04/17/2013 12:42:39 ******/ 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

ALTER procedure [dbo].[report_r_and_l] 
@fdate date, 
@tdate date, 
@key varchar(1) 
as 

if(@key='r') 

    select * 
    from dbo.books 
    where isbn =(select isbn from dbo.lending where (act between @fdate and @tdate) and (stat ='close')) 

else if(@key='l') 

    select * 
    from dbo.books 
    where isbn =(select isbn from dbo.lending where lended_date between @fdate and @tdate) 

ich weiß, Sub-Abfrage zurückgeben ist mehr als eine Abfrage zur Haupt Abfrage, aber ich weiß nicht, wie diese Fehler zu vermeiden, kann jemand mir helfen?

+0

Anscheinend Das 'select isbn' gibt mehr als einen Wert zurück. Du könntest 'where isbn IN benutzen (wähle isbn ...' –

Antwort

25

Das Problem ist, verwenden, dass diese beiden Abfragen sind Jeder gibt mehr als einen zurück Zeile:

select isbn from dbo.lending where (act between @fdate and @tdate) and (stat ='close') 
select isbn from dbo.lending where lended_date between @fdate and @tdate 

Sie haben zwei Möglichkeiten, abhängig von Ihrem gewünschten Ergebnis. Sie können entweder die oben genannten Abfragen mit etwas ersetzen, das eine einzelnen Reihe zurückzukehren garantiert wird (zum Beispiel durch SELECT TOP 1 verwendet wird), oder Sie können Ihre =-IN wechseln und mehrere Zeilen zurückgeben, wie folgt aus:

select * from dbo.books where isbn IN (select isbn from dbo.lending where (act between @fdate and @tdate) and (stat ='close')) 
+0

Ich habe das mein Freund, Thankz. Ich möchte eine Sache darüber wissen, nur eine ist in der Bücher-Tabelle beziehen sich auf ausgewählte isbn, ich möchte wählen Sie aus der Kreditvergabe Tabelle, lend_no aus Kreditor-Tabelle sudent_name von Student-Tabelle beziehen sich auf Index-Nummer in der Ausleih-Tabelle, wie mehrere retrive Zeilen aus mehreren Tabellen ?? – Roshan

+0

Schöne klare Antwort @Dan. – Ads

+1

Es sollte wahrscheinlich lent_date statt lended_date sein. Ich habe gerade gesagt ... – sanepete

4

Sie können IN-Operator wie unten

select * from dbo.books where isbn IN 
(select isbn from dbo.lending where lended_date between @fdate and @tdate) 
8

Gebrauch verwenden In statt =

select * from dbo.books 
where isbn in (select isbn from dbo.lending 
       where act between @fdate and @tdate 
       and stat ='close' 
       ) 

oder Sie können Exists

SELECT t1.*,t2.* 
FROM books t1 
WHERE EXISTS (SELECT * FROM dbo.lending t2 WHERE t1.isbn = t2.isbn and 
       t2.act between @fdate and @tdate and t2.stat ='close') 
+0

thnx bro. Du hast meinen Tag gerettet:). Ich verdiene eine Dose extra großes Bier. – Kings

+0

SET atRate1 = (SELECT t1. *, T2. * FROM RateCode t1 WHERE EXISTS (SELECT * FROM RateAmount t2 WHERE t1.RateCode = t2.RateCode UND t1.CountryCode = @CCode UND t1.ModuleCode = @MCode)) Ich bekomme Fehler auf t2. * –

Verwandte Themen