我在sql查询中陷入了一个地方。我有20个数据库,所有数据库的表名和列名相同但数据不同。我正在创建一个SQL查询,以便从所有数据库中获取特定日期的付款金额。
我在付款表中有很多列。我需要关于paymentTypeID列的总和(金额),因为我可以在paymentTypeID的基础上获得金额。所有paymentTypeID在数据库中都不同,但有时它们是相同的。我为此创建了一个游标。
我的代码是:
create table #tmpDBs(DBName varchar(255), CurrentDayPaymentAmount float)
declare cDBs cursor for
select name from master.dbo.sysdatabases
declare @DB varchar(255)
open cDBs
fetch next from cDBs into @DB
while @@fetch_status = 0
begin
exec('
declare @DateCurrent datetime
set @DateCurrent = '{Current Date}'
insert into #tmpDBs
select DBName = ' + @DB + ',
CurrentDayPaymentAmount = (select sum(p.amount) from ' + @DB + '.dbo.Payment p where p.eDate between @DateCurrent and dateadd(day, 1, @DateCurrent) and (p.paymenttypeid in (14, 15, 16, 17, 21, 22, 24, 35, 37, 38, 50)))
')
fetch next from cDBs into @DB
end
close cDBs
deallocate cDBs
select * from #tmpDBs
drop table #tmpDBs
我使用In子句将所有数据库paymenttypeid一起传递。 此代码用于从2个数据库中检索付款金额。 paymenttypeid 14,15,16,17,22,24,38用于第一数据库,21,35,37,50用于第二数据库。我的问题是,当我将这些paymentTypeID放在 In 子句中时,它会添加其他数据库的匹配paymenttypeid的数量。 例如,如果第一个数据库实际数量是4589 $,但它通过使用第二个数据库paymenttypeid添加额外的金额5469 $。如果我只传递一个数据库paymenttypeid,则显示正确的数量。
我的查询中有什么问题。
答案 0 :(得分:1)
我认为您自己解释了这个问题:您只需要DB1中的类型1,2和3以及DB2中只需要类型4,5和6,但您的查询不会这样做,它会询问类型1,2,来自DB1和DB2的3,4,5和6。
这意味着您需要为每个数据库使用不同的WHERE子句,具体取决于您需要的类型。那么,您如何知道每个数据库中需要哪些类型,以及如何在存储过程中表达该逻辑?
作为一个完全不同的解决方案,使用正确的WHERE子句在每个数据库中创建一个视图,然后只查询报告的视图。