我试图在改变where子句中的某个值的同时将同一个表连接在一起。我遇到的问题是循环之间的联合。我不能使用表变量,因为模式太复杂,每次都不能手工编写。临时表似乎是要走的路,但我不知道如何让它工作和正确的语法。
psudo我想要实现的代码:
DECLARE @var int, #tempTable
SET @var = someValue
WHILE expressionIncludingVar
#tempTable = SELECT *
FROM someTable
WHERE column = @var
UNION ALL #tempTable
SET @var = someChangeToVar
RETRUN #tempTable
查询的结果应该是#tempTable,因此很奇怪" RETURN#tempTable"。
提前谢谢。
编辑: 另一个硬编码的例子: 我试图解密这样的事情:
SELECT someAggregateColumns
FROM table
WHERE someDateColumn > @date and < someDateColumn < DATEADD(month, 2, @date)
GROUP BY someColumn
UNION ALL
SELECT someAggregateColumns
FROM table
WHERE someDateColumn > DATEADD(month, 1, @date) and and < someDateColumn < DATEADD(month, 1, DATEADD(month, 3, @date))
GROUP BY someColumn
SELECT someAggregateColumns
FROM table
WHERE someDateColumn = DATEADD(month, 2, @date) DATEADD(month, 1, DATEADD(month, 4, @date))
GROUP BY someColumn
UNION ALL
....etc
答案 0 :(得分:1)
如果每个周期中唯一不同的是计数器,那么为什么你只编写一个包含所有数据的查询呢?
而不是WHERE column = @var
使用WHERE column >= 0 AND column <= @maxVarValue
。
如果您的条件更复杂,您应该考虑使用包含要过滤的列的小(临时)表,然后将该表连接到您的源以获得所需的结果。
根据评论,您可以使用计数表(或数字表)。
示例:
DECLARE @Tally (Number INT);
INSERT INTO @Tally (Number) VALUES (0),(1),(2),(3),(4),(5);
SELECT
someAggregateColumns
FROM
table AGG
INNER JOIN @Tally T
ON AGG.someDateColumn = DATEADD(month, T.Number, @date)
WHERE
T.Number >= 0
AND T.Number <= 3
;
上述查询将返回当前和未来3个月的结果。
您可以保留数字表并重新使用它。我通常有一个叫util.Number
。
答案 1 :(得分:1)
也许递归CTE适合你。
你可以试试这个。
DECLARE @MyTable TABLE(ID INT, ColumnA VARCHAR(10), ColumnB VARCHAR(10))
INSERT INTO @MyTable VALUES
(1,'A', '10'),
(2,'B', '11'),
(3,'C', '12'),
(4,'D', '13'),
(5,'E', '14'),
(6,'F', '15'),
(7,'H', '16')
DECLARE @var INT = 4
;WITH CTE AS (
SELECT * FROM @MyTable WHERE ID = @var
UNION ALL
SELECT T.* FROM CTE INNER JOIN @MyTable T ON CTE.ID - 1 = T.ID
)
SELECT * INTO #tempTable FROM CTE
SELECT * FROM #tempTable
DROP TABLE #tempTable
答案 2 :(得分:0)
基于第二个例子你想要的是什么
SELECT someAggregateColumns
FROM table
WHERE someDateColumn IN (
@date,
DATEADD(month, 1, @date),
DATEADD(month, 2, @date),
DATEADD(month, 3, @date)
)
GROUP BY someColumn
现在,如果你想要一个范围更容易:
WHERE someDateColumn BETWEEN @date
AND DATEADD(month, 3, @date)
答案 3 :(得分:0)
使用TALLY表和CROSS APPLY,您可以生成要检查的日期:
DECLARE @Var INT = 4
DECLARE @Date Date = '2017-01-01'
;WITH Tally
AS
(
SELECT ROW_NUMBER() OVER (ORDER BY Object_Id) -1 AS Num
FROM sys.columns
)
SELECT *
FROM MyTable
CROSS APPLY Tally
WHERE Num < @var AND
MyDate = DATEADD(month, num, @date)