2013-04-17 38 views
11

Tôi có một thủ tục được lưu trữ select * from book table, sử dụng truy vấn phụ truy vấn của tôiTruy vấn con trả về nhiều hơn 1 giá trị.Điều này không được phép khi truy vấn con sau =,! =, <,<=,>,> = hoặc khi truy vấn con được sử dụng làm biểu thức

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) 

Tôi biết truy vấn phụ trả về nhiều truy vấn cho truy vấn chính, nhưng tôi không biết cách tránh lỗi này, bất kỳ ai có thể giúp tôi không?

+0

Rõ ràng rằng 'select isbn' trả về nhiều hơn một giá trị. Bạn có thể sử dụng 'where isbn IN (chọn isbn ...' –

Trả lời

25

Vấn đề là hai truy vấn đây là những mỗi người trở lại nhiều hơn một hàng:

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 

Bạn có hai lựa chọn, tùy thuộc vào kết quả mong muốn của mình. Bạn có thể có thể thay thế các truy vấn ở trên với cái gì đó là đảm bảo để trả về một đơn hàng (ví dụ, bằng cách sử dụng SELECT TOP 1), HOẶC bạn có thể chuyển bạn =-IN và trở nhiều hàng, như thế này:

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

Tôi nhận được rằng bạn của tôi, Thankz. Tôi muốn biết một điều về điều này, chỉ có một trong bảng sách đề cập đến isbn được chọn, tôi muốn chọn isbn từ bảng cho vay, lend_no từ bảng cho vay sudent_name từ bảng học sinh tham khảo số chỉ mục trong bảng cho vay, cách truy xuất lại nhiều hàng từ nhiều bảng ?? – Roshan

+0

Câu trả lời rõ ràng tuyệt vời @Dan. – Ads

+1

Có lẽ nó phải là lent_date thay vì lended_date. Tôi chỉ đang nói ... – sanepete

4

Bạn có thể sử dụng IN điều hành như sau

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

Sử dụng In thay vì =

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

hoặc bạn có thể sử dụng 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 đã lưu ngày của tôi:). U xứng đáng với một lon bia cực lớn. – Kings

+0

SET atRate1 = (CHỌN t1. *, T2. * TỪ TỪ CHỨC NĂNG Mã T1 Ở ĐÂU NƠI (CHỌN * TỪ TỪA ĐỐI TÁC t2 WHERE t1.RateCode = t2.RateCode VÀ t1.CountryCode = @CCode AND t1.ModuleCode = @MCode)) Tôi nhận được lỗi trên t2. * –

Các vấn đề liên quan