私のクエリはサブクエリを使用してselect * from book table
というストアドプロシージャを持っています
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)
私はサブクエリがメインクエリに複数のクエリを返すことを知っていますが、このエラーを回避する方法がわかりません、誰も私を助けることができますか?
問題は、これらの2つのクエリがそれぞれ複数の行を返すことです。
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
希望する結果に応じて、2つの選択肢があります。上記のクエリをsingle行を返すことが保証されているものに置き換えることができます(たとえば、SELECT TOP 1
)、OR =
をIN
に変換し、次のように複数の行を返します。
select * from dbo.books where isbn IN (select isbn from dbo.lending where (act between @fdate and @tdate) and (stat ='close'))
=
の代わりにIn
を使用します
select * from dbo.books
where isbn in (select isbn from dbo.lending
where act between @fdate and @tdate
and stat ='close'
)
または、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' )
以下のようにIN演算子を使用できます
select * from dbo.books where isbn IN
(select isbn from dbo.lending where lended_date between @fdate and @tdate)