【问题标题】:How to set variable in to Ms Sql select如何将变量设置为 Ms Sql select
【发布时间】:2011-09-03 08:46:53
【问题描述】:

如何在MS Sql中设置select变量,思路如下:

Declare @var int

SET @var = 0;

Select (if(idid = @var) then sum+1 else sum-1) AS Sum,
   set @var = id 
FROM table

基于 cmets 进行编辑。

DECLARE @T TABLE
(
ID  INT PRIMARY KEY,
IDID INT,
SUMM INT 
)

INSERT INTO @T
SELECT 1,1,4 UNION ALL
SELECT 2,1,5 UNION ALL 
SELECT 3,2,6 UNION ALL 
SELECT 4,2,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

【问题讨论】:

  • 您发布的内容没有任何意义。架构和目的是什么?
  • 我已根据您的评论编辑了您的问题,但仍然不知道您在问什么。您能否自己编辑问题并解释用于获得预期结果的规则。您是否只希望每个 IDID 具有最小 id 值的行包含其存储值,而该 IDID 的所有其他行显示 summ 为零?

标签: sql-server variables select


【解决方案1】:

我有在使用我的测试数据时违反参照完整性的坏习惯。但这对于在我完成脚本测试后恢复具有引用完整性的数据很有用:

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));

没有返回任何值。

【讨论】:

    【解决方案2】:

    虽然和其他人一样,我不太明白,但下面的查询会产生原始帖子中指定的输出(反过来,它源自您的评论)。 这需要 SQL Server 2005 或更高版本

    WITH cte AS (
      SELECT
        ID,
        IDID,
        SUMM,
        RowNum = ROW_NUMBER() OVER (PARTITION BY IDID ORDER BY ID)
      FROM @T
    )
    SELECT
      ID,
      IDID,
      SUMM = CASE RowNum WHEN 1 THEN SUMM ELSE 0 END
    FROM cte
    

    基本上,SUMM 输出列包含原始表中的SUMM,如果这是IDIDID 排序的第一次出现,否则该列包含0

    不确定它与您所追求的相差多远,但也许它会帮助您更准确地解释您的问题。

    【讨论】:

      【解决方案3】:

      这是你想要做的吗?

      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
      

      【讨论】:

      • 表结构:ID IDID SUMM 1 1 4 2 1 5 3 2 6 4 2 7 5 3 8 在选择结果中我需要:ID IDID SUMM 1 1 4 2 1 0 3 2 6 4 2 0 5 3 8
      【解决方案4】:

      只需使用 SELECT。

      例如

      SELECT @myValue = MyField FROM MyTable WHERE ....
      

      【讨论】:

      • 从他的示例代码看来,他正在尝试执行某种循环。
      • @valisimo - 请提供您的表结构和示例数据来解释您的要求,而不是无效 SQL 的 sn-ps。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2011-06-06
      相关资源
      最近更新 更多