sql - 遍历临时表中的派生值,以便可以将其值用作使用 for 循环的 where 条件
问题描述
我可以从派生表中获取每个项目的总数,如下所示:
declare @laneNum int
declare @startDate date = '2019-02-07'
declare @class int = 1
declare @id int
if OBJECT_ID('tempdb..#tempLaneNumber') IS NOT NULL
drop table [#tempLaneNumber]
create table #tempLaneNumber
(
LANE_NUMBER INT NULL
)
INSERT INTO #tempLaneNumber (LANE_NUMBER)
SELECT DISTINCT EXIT_LANE
FROM [dbo].[TOLL]
ORDER BY EXIT_LANE DESC
select l.LANE_NUMBER, COUNT(*)
from [dbo].[TOLL] t
inner join #tempLaneNumber l on t.EXIT_LANE = l.LANE_NUMBER
where convert(date, TRXN_DTIME) = @startDate
GROUP BY l.LANE_NUMBER
但我现在需要的是遍历每个派生值,这样我就可以在一个语句中使用它,每个结果都可以放在一个变量中。这就是我在当前代码中得到的...
我需要将 LANE_NUMBER 4 放入 x4 变量,将 LANE_NUMBER 6 放入 x6 变量等等。我怎么去呢?
编辑
declare @laneNum int
declare @startDate date = '2019-02-07'
declare @class int = 1
declare @id int
if OBJECT_ID('tempdb..#tempLaneNumber') IS NOT NULL
drop table [#tempLaneNumber]
create table #tempLaneNumber
(
LANE_NUMBER INT NULL
)
INSERT INTO #tempLaneNumber (LANE_NUMBER)
SELECT DISTINCT EXIT_LANE
FROM [dbo].[TOLL]
ORDER BY EXIT_LANE DESC
;WITH CTE AS
(
select l.LANE_NUMBER, COUNT(*) CT
from [dbo].[TOLL] t
inner join #tempLaneNumber l on t.EXIT_LANE = l.LANE_NUMBER
where convert(date, TRXN_DTIME) = @startDate
GROUP BY l.LANE_NUMBER
)
SELECT * FROM CTE where LANE_NUMBER = 4
这是正确的,但问题是我需要对值“4”或“6”或“7”进行硬编码。这个样本有 4 个结果,所以没关系。但是如果我有 10 个或更多呢?
解决方案
如果您想稍后使用结果,您可以使用临时表,如下所示。
create table #Results
(
LANE_NUMBER INT NULL,
[Count_LN] INT
)
INSERT INTO #Results
select l.LANE_NUMBER, COUNT(*) CT
from [dbo].[TOLL] t
inner join #tempLaneNumber l on t.EXIT_LANE = l.LANE_NUMBER
where convert(date, TRXN_DTIME) = @startDate
GROUP BY l.LANE_NUMBER
如果你想在下一个语句中立即使用输出,你可以像下面这样去 CTE。
;WITH CTE AS
(
select l.LANE_NUMBER, COUNT(*) CT
from [dbo].[TOLL] t
inner join #tempLaneNumber l on t.EXIT_LANE = l.LANE_NUMBER
where convert(date, TRXN_DTIME) = @startDate
GROUP BY l.LANE_NUMBER
)
SELECT * FROM CTE --USER YOUR CTE HERE
编辑:
我无法完全理解您的要求,如果您想迭代表并将每一行的列值存储到变量中,您可以尝试如下。
create table #Results
(
LANE_NUMBER INT NULL,
[Count_LN] INT
)
INSERT INTO #Results
select l.LANE_NUMBER, COUNT(*) CT
from [dbo].[TOLL] t
inner join #tempLaneNumber l on t.EXIT_LANE = l.LANE_NUMBER
where convert(date, TRXN_DTIME) = @startDate
GROUP BY l.LANE_NUMBER
declare @ln int
declare @ct int
While (Select Count(*) From #Results) > 0
Begin
select top 1 @ln = LANE_NUMBER, @ct = [Count_LN] from #Results
-- Use the variable @ln and @ct. For example, if you want to call a sp
-- exec call_someothersp @ln,@ct
Delete From #Results Where LANE_NUMBER = @ln and [Count_LN]=@ct
End
推荐阅读
- php - X-XSS-Protection 标头未定义
- vim - 除非我在 repl 中切换到命名空间,否则表单评估会运行整个文件
- unity3d - 有 Unity 类似手机的多人游戏系统吗?
- python-3.x - 如何在当前行之前 60 秒返回行的索引
- arm - ARMv6M ADD(register) T2 Encoding 规范中的“DN”是什么?
- c# - 从网站上抓取的字符串有 ' ' 输出为 '?'
- sql - 如何添加带整数的日期
- javascript - SyntaxError:位置 2 处 JSON 中的意外标记 v
- typo3 - tx_news 翻译中的错误内容元素
- javascript - Chrome 扩展程序(页面上的内容脚本)是否可以访问 TINYMCE 编辑器中的光标位置?