Подзапрос возвратил более 1 значения. Это недопустимо, когда подзапрос следует за =,! =, <, <=,>,> = Или когда подзапрос используется как выражение
У меня есть хранимая процедура, которая select * from book table
, используя sub-запрос, мой запрос
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)
Я знаю, что sub-запрос возвращает более одного запроса в основной запрос, но я не знаю, как избежать этой ошибки, может ли кто-нибудь мне помочь?
Проблема в том, что эти два запроса возвращают несколько строк:
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
У вас есть два варианта, в зависимости от желаемого результата. Вы можете либо заменить вышеперечисленные запросы тем, что гарантированно будет возвращать одну строку (например, с помощью SELECT TOP 1
), либо вы можете переключить свой =
на 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)