问题描述
|
如何在MS sql中设置选择变量,想法如下所示:
Declare @var int
SET @var = 0;
Select (if(idid = @var) then sum+1 else sum-1) AS Sum,set @var = id
FROM table
根据评论进行编辑。
DECLARE @T TABLE
(
ID INT PRIMARY KEY,IDID INT,SUMM INT
)
INSERT INTO @T
SELECT 1,1,4 UNION ALL
SELECT 2,5 UNION ALL
SELECT 3,2,6 UNION ALL
SELECT 4,7 UNION ALL
SELECT 5,3,8
在选择结果中,我需要:
ID IDID SUMM
-- ---- ----
1 1 4
2 1 0
3 2 6
4 2 0
5 3 8
解决方法
这是您要做什么?
Declare @var int,@id int
SET @var = 0
SELECT @id = id FROM Table t
if(@id = @var)
BEGIN
SET @var = @var + 1
END
ELSE
BEGIN
SET @var = @var - 1
END
print @var
, 只需使用SELECT。
例如
SELECT @myValue = MyField FROM MyTable WHERE ....
, 尽管和其他人一样,我并没有真正的主意,但下面的查询会产生原始帖子中指定的输出(该帖子又从您的评论中得出)。这需要SQL Server 2005或更高版本。
WITH cte AS (
SELECT
ID,IDID,SUMM,RowNum = ROW_NUMBER() OVER (PARTITION BY IDID ORDER BY ID)
FROM @T
)
SELECT
ID,SUMM = CASE RowNum WHEN 1 THEN SUMM ELSE 0 END
FROM cte
基本上,如果按“ 9”的顺序第一次出现“ 8”,则“ 6”输出列包含原始表中的“ 6”,否则该列包含“ 10”。
不知道离您要走的路有多远,但是也许它将帮助您更准确地解释您的问题。
, 使用测试数据时,我习惯于违反参照完整性。但这对于在我完成脚本测试后恢复具有参照完整性的数据很有用:
DECLARE @foreign_id INTEGER;
SET @foreign_id = (SELECT TOP 1 (FK_column) FROM (FK_table));
-- To confirm the value is what you want it to be
SELECT @foreign_id;
现在,我可以在完成后将数据多次插入回去,使用此值可以确保:
-- Referential integrity check:
SELECT (FK_column) FROM (FK_table)
WHERE (FK_column) NOT IN
(SELECT (PK_column) FROM (PK_table));
没有返回任何值。