web-dev-qa-db-ja.com

サブクエリが複数の値を返しました。サブクエリが=、!=、<、<=、>、> =の後に続く場合、またはサブクエリが式として使用される場合、これは許可されません

私のクエリはサブクエリを使用して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)

私はサブクエリがメインクエリに複数のクエリを返すことを知っていますが、このエラーを回避する方法がわかりません、誰も私を助けることができますか?

14
Roshan

問題は、これらの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'))
24
Dan Puzey

=の代わりに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' )
9
praveen

以下のようにIN演算子を使用できます

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