Vraag Subquery retourneerde meer dan 1 waarde. Dit is niet toegestaan ​​wanneer de subquery =,! =, <, <=,>,> = Of wanneer de subquery wordt gebruikt als een uitdrukking


Ik heb een opgeslagen procedure die select * from book table , met behulp van subquery is mijn query

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)

Ik weet dat de subquery meer dan één query naar de hoofdquery retourneert, maar ik weet niet hoe ik deze fout moet voorkomen, kan iemand me helpen?


11
2018-04-17 07:17


oorsprong


antwoorden:


Het probleem is dat deze twee query's elk meer dan één rij retourneren:

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

Je hebt twee keuzes, afhankelijk van je gewenste resultaat. U kunt de bovenstaande query's vervangen door iets dat gegarandeerd een a retourneert single rij (bijvoorbeeld door SELECT TOP 1), OF u kunt van uw wisselen = naar IN en retourneer meerdere rijen, zoals deze:

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

25
2018-04-17 07:21



Gebruik In in plaats van =

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

of je kunt gebruiken 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' )

8
2018-04-17 07:21



U kunt IN-operator gebruiken zoals hieronder

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

4
2018-04-17 07:20