2013-04-17 7 views
11

Mam procedurę przechowywaną, która select * from book table, używając sub zapytania, moje zapytanie jestPodzapytanie zwróciło więcej niż jedną wartość. Nie jest to dozwolone, gdy podzapytanie następuje po, =,! =, <,<=,>,> = lub gdy podkwerenda jest używana jako wyrażenie

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) 

wiem kwerendy sub jest powrót więcej niż jednego zapytania do głównej zapytania, ale nie wiem, jak uniknąć tego błędu, może ktoś mi pomoże?

+0

Apparently że 'select isbn' zwraca więcej niż jedną wartość. Możesz użyć 'where isbn IN (wybierz isbn ...' –

Odpowiedz

25

Problemem jest to, że te dwa pytania są każdy wraca więcej niż jeden wiersz:

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 

Masz dwie możliwości, w zależności od pożądanego rezultatu. Można też zastąpić powyższe zapytania z czymś, co jest gwarantowane, aby powrócić do pojedynczy wiersz (na przykład za pomocą SELECT TOP 1), można też przełączyć swój = do IN i wrócić wiele wierszy, tak:

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

Dostałem to, mój przyjacielu, Thankz. Chcę się o tym dowiedzieć, tylko jedna jest w książce, odnoszą się do wybranego isbn, chcę wybrać isbn z tabeli pożyczek, lend_no z tabeli pożyczek sudent_name z tabeli uczniowskiej odnoszą się do numeru indeksu w tabeli pożyczek, jak pobrać wiele wiersze z wielu tabel? – Roshan

+0

Ładna, wyraźna odpowiedź @Dan. – Ads

+1

Prawdopodobnie powinno to być pożyczone, a nie pożyczone. Po prostu mówię ... – sanepete

4

można używać w operatora jak poniżej

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

użytkowania In zamiast =

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

lub użyć 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. U zapisał mój dzień:). Zasługujesz na puszkę ekstra dużego piwa. – Kings

+0

SET atRate1 = (SELECT T1. *, T2 *. Z RateCode T1, jeżeli istnieje (SELECT * Z RateAmount t2 GDZIE t1.RateCode = t2.RateCode I t1.CountryCode = @CCode I t1.ModuleCode = @MCode)) Dostaję błąd na t2. * –

Powiązane problemy