Подзапрос возвратил более 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-запрос возвращает более одного запроса в основной запрос, но я не знаю, как избежать этой ошибки, может ли кто-нибудь мне помочь?

Ответ 1

Проблема состоит в том, что каждый из этих двух запросов возвращает несколько строк:

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'))

Ответ 2

Используйте 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' )

Ответ 3

Вы можете использовать оператор IN, как показано ниже

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

Ответ 4

Пожалуйста, проверьте дубликаты записей в связанной таблице.....

от

Винаякумар пули. *

Ответ 5

USE [SmartOffice]
GO
/****** Object:  StoredProcedure [dbo].[usp_DeviceMapping]    Script Date: 02-02-2019 15:15:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[usp_DeviceMapping]
    AS BEGIN
    SELECT DeviceId,DTypeId,DType from DeviceMapping
      DECLARE @DType INT;
      DECLARE @DeviceLogId int;
      DECLARE @DownloadDate Date;DECLARE @DeviceId INT;
      DECLARE @UserId varchar(50);DECLARE @LogDate Date;
      DECLARE @Direction varchar(10);DECLARE @AlternateAttDirection varchar(10);
      DECLARE @AttDirection varchar(10);DECLARE @StatusCode varchar(10);
      DECLARE @WorkCode INT;DECLARE @Duration INT;DECLARE @Remarks varchar(500);DECLARE @SMSFlag INT;
      DECLARE @VerificationMode varchar(50);DECLARE @IsApproved INT;
      DECLARE @AttenndanceMarkingType varchar(50);DECLARE @AttMarkAndroidIMEINo varchar(50);
      DECLARE @ManagerRemarks varchar(200);DECLARE @LogRecordLocation varchar(500);
      DECLARE @Lattitude varchar(50);DECLARE @Longitude varchar(50);
      DECLARE @NetworkLattitude varchar(50); DECLARE @NetworkLongitude varchar(50);
      DECLARE @NetworkLocation varchar(500)

      DECLARE cur_Smart CURSOR
      STATIC FOR 
      SELECT DeviceLogId,AttenndanceMarkingType,DownloadDate,DeviceId,UserId,LogDate,Direction,AttDirection,
      AlternateAttDirection,StatusCode,WorkCode,Duration,Remarks,SMSFlag,VerificationMode,IsApproved,
      LogRecordLocation,ManagerRemarks,AttMarkAndroidIMEINo,Lattitude,Longitude,NetworkLattitude,
      NetworkLongitude,NetworkLocation FROM DeviceLogs_1_2019
      SELECT DeviceId,DeviceFName FROM Devices
      SELECT DTypeId,DType FROM DeviceMapping

      OPEN cur_Smart 
      IF @@CURSOR_ROWS > 0
        BEGIN 
        FETCH NEXT FROM cur_Smart INTO @DeviceLogId,@AttenndanceMarkingType,@DownloadDate,@DeviceId,@UserId,@LogDate,@Direction,@AttDirection,
      @AlternateAttDirection,@StatusCode,@WorkCode,@Duration,@Remarks,@SMSFlag,@VerificationMode,@IsApproved,
      @LogRecordLocation,@ManagerRemarks,@AttMarkAndroidIMEINo,@Lattitude,@Longitude,@NetworkLattitude,
      @NetworkLongitude,@NetworkLocation
         SET @DType = (SELECT DType  FROM DeviceMapping DM
         WHERE [email protected])
         if(@DType=1)
         insert into DeviceLogs_Workmen(DownloadDate,DeviceId,UserId,LogDate,
    Direction,AttDirection,AlternateAttDirection,StatusCode,WorkCode,Duration,Remarks,SMSFlag,VerificationMode,
    IsApproved,AttenndanceMarkingType,AttMarkAndroidIMEINo,ManagerRemarks,LogRecordLocation,Lattitude,Longitude)
    values   (@DownloadDate,@DeviceId,@UserId,@LogDate,
    @Direction,@AttDirection,@AlternateAttDirection,@StatusCode,@WorkCode,@Duration,@Remarks,@SMSFlag,@VerificationMode,
    @IsApproved,@AttenndanceMarkingType,@AttMarkAndroidIMEINo,@ManagerRemarks,@LogRecordLocation,@Lattitude,@Longitude);

    ELSE 
        insert into DeviceLogs_Staff (DownloadDate,DeviceId,UserId,LogDate,
    Direction,AttDirection,AlternateAttDirection,StatusCode,WorkCode,Duration,Remarks,SMSFlag,VerificationMode,
    IsApproved,AttenndanceMarkingType,AttMarkAndroidIMEINo,ManagerRemarks,LogRecordLocation,Lattitude,Longitude)
    values   (@DownloadDate,@DeviceId,@UserId,@LogDate,
    @Direction,@AttDirection,@AlternateAttDirection,@StatusCode,@WorkCode,@Duration,@Remarks,@SMSFlag,@VerificationMode,
    @IsApproved,@AttenndanceMarkingType,@AttMarkAndroidIMEINo,@ManagerRemarks,@LogRecordLocation,@Lattitude,@Longitude);


  FETCH NEXT FROM cur_Smart INTO @DeviceLogId,@AttenndanceMarkingType,@DownloadDate,@DeviceId,@UserId,@LogDate,@Direction,@AttDirection,
      @AlternateAttDirection,@StatusCode,@WorkCode,@Duration,@Remarks,@SMSFlag,@VerificationMode,@IsApproved,
      @LogRecordLocation,@ManagerRemarks,@AttMarkAndroidIMEINo,@Lattitude,@Longitude,@NetworkLattitude,
      @NetworkLongitude,@NetworkLocation
  END
  END
CLOSE cur_Smart
DEALLOCATE cur_Smart
SET NOCOUNT OFF 

Подзапрос вернул более 1 значения. Это недопустимо, когда подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения