2013-04-17 16 views
11

ifadesi olarak kullanıldığında Sorgumun alt sorgusu kullanılarak select * from book table saklı yordamım var. Alt sorgu 1'den fazla değer döndürdü. Bu alt sorgunun izlediği zaman izin verilmiyor =,! =, <,<=,>,> = veya alt sorgu

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) 

ben alt sorgusu ana sorguya bir sorgunun daha dönmek olduğunu biliyorum, Ama bu hatayı önlemek için nasıl bilmiyorum, herhangi biri bana yardımcı olabilir?

+0

Görünüşe 'select isbn', birden fazla değer döndürür. '' Isbn IN 'yi kullanabilirsiniz (select isbn ...' yi seçtiniz ... –

cevap

25

sorun kullanabilirsiniz bu iki sorgular olmasıdır her biri birden fazla dönen satır:

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 

İstediğiniz sonuca bağlı olarak iki seçeneğiniz vardır. Ya (SELECT TOP 1 kullanarak, örneğin) bir tek satır dönmek için garantili bir şeyle yukarıdaki sorguları yerine VEYA böyle, senin =IN geçmek ve birden fazla satır döndürebilir:

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

Bu arkadaşımı aldım, Teşekkürler. Bu konuda bir şey bilmek istiyorum, sadece bir kitap tablo seçili isbn başvurmak, ödünç tablosundan isbn seçmek istiyorum, lend_no ödünç tablosundan tablo sudent_name gelen öğrenci tablosundan endeks numarası tablosuna bakın, nasıl birden çok geri almak için Birden çok tablodan satırlar ?? – Roshan

+0

Güzel açık cevaplı @Dan. – Ads

+1

Muhtemelen lended_date yerine lent_date olmalıdır. Sadece söylüyorum ... – sanepete

4

Sen

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

Kullanım In yerine = altına

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

olarak operatör İÇİNDE kullanabilir veya 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') 
+0

thnx bro. U günümü kurtardı:). U fazladan bir bira birasını hak ediyor. – Kings

+0

SET atRate1 = (t1 SEÇ. *, T2. * SELECT (MEVCUT RateCode t1 * RateAmount t2 WHERE t1.RateCode = t2.RateCode ve t1.CountryCode = @CCode ve t1.ModuleCode = @MCode)) t2'de hata alıyorum. * –