Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL循环遍历表中的记录_Sql_Loops_Cursor_Case - Fatal编程技术网

SQL循环遍历表中的记录

SQL循环遍历表中的记录,sql,loops,cursor,case,Sql,Loops,Cursor,Case,我有一个名为master的表,主键是account_num。每个账号都有一个account_类型(单个字符)。我需要做以下工作: 查找类型为a或B的所有帐户 将该账号存储在名为year_end_close的新表中,并附上交易发生的时间戳 将master中的所有帐户设置为a到C类型,并将所有帐户设置为B到D类型 在SQL中处理此问题的最佳方法是什么?While循环?案例陈述?光标?感谢您的帮助。这个表大约有17000行 你在找这样的东西吗?(替换实际SQL语句的“PRINT”语句) 你在找这样的东

我有一个名为master的表,主键是account_num。每个账号都有一个account_类型(单个字符)。我需要做以下工作:

  • 查找类型为a或B的所有帐户
  • 将该账号存储在名为year_end_close的新表中,并附上交易发生的时间戳
  • 将master中的所有帐户设置为a到C类型,并将所有帐户设置为B到D类型

  • 在SQL中处理此问题的最佳方法是什么?While循环?案例陈述?光标?感谢您的帮助。这个表大约有17000行

    你在找这样的东西吗?(替换实际SQL语句的“PRINT”语句)


    你在找这样的东西吗?(替换实际SQL语句的“PRINT”语句)


    您不需要使用游标/循环来执行类似的操作。在编写SQL时,始终首先尝试寻找基于集合的解决方案。我建议使用
    案例
    声明,这是您提到的选项之一

    试试这个:

    BEGIN TRAN;
    
    SELECT account_num, CURRENT_TIMESTAMP
    INTO year_end_close
    FROM dbo.master
    WHERE account_type IN ('a','b');
    
    UPDATE dbo.master
    SET account_type = CASE account_type
                         WHEN 'a' THEN 'c'
                         WHEN 'b' THEN 'd'
                         ELSE account_type
                         END
    WHERE account_type IN ('a','b');
    
    COMMIT TRAN;
    

    您不需要使用游标/循环来执行类似的操作。在编写SQL时,始终首先尝试寻找基于集合的解决方案。我建议使用
    案例
    声明,这是您提到的选项之一

    试试这个:

    BEGIN TRAN;
    
    SELECT account_num, CURRENT_TIMESTAMP
    INTO year_end_close
    FROM dbo.master
    WHERE account_type IN ('a','b');
    
    UPDATE dbo.master
    SET account_type = CASE account_type
                         WHEN 'a' THEN 'c'
                         WHEN 'b' THEN 'd'
                         ELSE account_type
                         END
    WHERE account_type IN ('a','b');
    
    COMMIT TRAN;
    


    您可以通过两个查询来完成。插入和更新。嗯,如果您尚未创建表,请执行3次查询。我对SQL脚本的熟悉程度非常有限-我知道我将如何使用其他语言执行此操作,但我的不确定性在于如何确保我查看表中的每条记录并对每条记录执行操作-如果有意义的话。您的数据库是什么?SQL Server?神谕MySQL?数据库是SQL Server您可以通过两个查询来完成。插入和更新。嗯,如果您尚未创建表,请执行3次查询。我对SQL脚本的熟悉程度非常有限-我知道我将如何使用其他语言执行此操作,但我的不确定性在于如何确保我查看表中的每条记录并对每条记录执行操作-如果有意义的话。您的数据库是什么?SQL Server?神谕MySQL?数据库是SQL Server这基本上是我的做法,不过我会选择一些细节,使用ANSI
    current\u timestamp
    而不是专有的
    getdate()
    ,并对select和update应用相同的where子句。@TimLehner你说得对,这是很好的观点。我通常使用
    当前时间戳
    我自己;我只是觉得对于不习惯SQL的人来说,
    getdate()
    更容易理解,我不知道
    current\u timestamp
    是ANSI标准。我将编辑我的答案。关于集合逻辑的好建议。选择。。。进入也是专有语法。如果您想严格遵守ANSI标准,请使用单独的CREATETABLE和INSERT。。。选择。。。此外,您可能希望筛选在“年终”中存在的行。根据活动和隔离级别,您可以更新插入的行或插入后更新到年底的行。非常感谢-这似乎正是我需要的!这基本上就是我要做的,尽管我会选择NIT并使用ANSI
    current\u timestamp
    而不是专有的
    getdate()
    ,并对select和update应用相同的where子句。@TimLehner你说得对,很好。我通常使用
    当前时间戳
    我自己;我只是觉得对于不习惯SQL的人来说,
    getdate()
    更容易理解,我不知道
    current\u timestamp
    是ANSI标准。我将编辑我的答案。关于集合逻辑的好建议。选择。。。进入也是专有语法。如果您想严格遵守ANSI标准,请使用单独的CREATETABLE和INSERT。。。选择。。。此外,您可能希望筛选在“年终”中存在的行。根据活动和隔离级别,您可以更新插入的行或插入后更新到年底的行。非常感谢-这似乎正是我需要的!