多个子查询...更好的方法

时间:2016-04-29 15:37:45

标签: sql-server tsql

首先对不起,如果我的英语水平不高: - )

我需要一些SQL Server查询的帮助...(我在SQL中有点新的东西)。

我在某些产品的特定日期(一天)有一张产品库存表。如果没有库存变动,不是每天都有库存记录。这是我的表:

Table : Stocks

Columns : ProductCode | Date | Stock |

每次我们进行库存移动时,我们都会添加一个新行,因此很可能在很多产品代码中找到了记录中的记录

如果我需要特定日期的产品库存,这是我的SQL查询

Date : 1-4-2016
Product : bm500w


 select top 1 stock 
 from stocks 
 where productcode = 'bm500w' 
 and Date <= '1-4-2016' 
 order by Date desc

此查询正在运行,但我有一个新的&#34;首席请求&#34;。我需要一个查询来查看过去30天内特定产品的库存。

查询应为:

select top 1 ProductCode,
       (select top 1 Stock from Stocks  where ProductCode = mv.ProductCode 
        and Date <= getdate()-1 order by Date desc) as Dia1,
       (select top 1 Stock from Stocks  where ProductCode = mv.ProductCode 
        and Date <= getdate()-2 order by Date desc) as Dia2,
       (select top 1 Stock from Stocks  where ProductCode = mv.ProductCode 
        and Date <= getdate()-29 order by Date desc) as Dia29,
       (select top 1 Stock from Stocks  where ProductCode = mv.ProductCode 
        and Date <= getdate()-30 order by Date desc) as Dia30
from Stocks mv 
where mv.ProductCode = 'bm500w'

我确定此查询有效,但我确信,确定有更好的,优化的&#34;,方法或代码可以获得相同的结果。

1 个答案:

答案 0 :(得分:0)

我建议您使用union,但是您可以使用相同的方法使用join。

declare @sqlStr nvarchar(max) = ';with cte as (' + char(13)

declare @i int = 1

while @i <= 30
begin
    set @sqlStr = @sqlStr + 
        'select top 1 Stock as Dia from Stocks  where ProductCode = mv.ProductCode and Date <= getdate() - ' + cast(@i as varchar) + ' order by Date desc' + CHAR(13)

    if (@i < 30)
        set @sqlStr = @sqlStr + 'union all' + CHAR(13)

    set @i = @i + 1
end
set @sqlStr = @sqlStr + ')' + CHAR(13) + 'select top 1 ProductCode, cte.Dia from Stocks mv inner join cte on cte.ProductCode = mv.ProductCode where mv.ProductCode = @prdCode' 
print @sqlStr
exec sp_executesql @sqlStr, N'bm500w'

注意: 当我在第一个语句中使用@i时,我认为可能存在SQL注入的风险,因此如果您担心安全性,请注意这一点。

如果帖子已回答问题

,请“标记为答案”