【问题标题】:SQL Looping through resultsSQL 循环遍历结果
【发布时间】:2009-10-13 16:04:47
【问题描述】:

我做了一个选择,它会返回一个 ID 列表。然后我想为每个 ID 调用另一个计算结果的过程,所以我最终得到了一个结果列表。

我该怎么做?我需要某种循环,但我不太擅长 SQL。

编辑:Microsoft SQL 2008,纯 SQL

【问题讨论】:

  • 您使用的是什么 DBMS?你的前端应用程序是用什么写的? MySQL、PHP 还是其他?
  • 你想用什么语言来做这个?
  • 我们需要更多内容来提供帮助 - 哪些表和它们的列,以及您要具体计算什么?
  • 循环/游标通常很慢,几乎总是可以用没有循环或游标的 SQL 替换它们,尤其是在 SQL 2008 中
  • 我不明白如何...我想在我的数据库中的每个用户上运行一个函数,因此我肯定需要循环遍历它们吗?

标签: sql


【解决方案1】:

编写一个用户定义的函数,接收 ID 并返回计算结果,然后您可以使用如下查询获取每个 ID 的结果:

SELECT id, DatabaseYouUsed.dbo.functionYouWrote(id)
FROM DatabaseYouUsed.dbo.TableWithIDs

【讨论】:

  • 我认为这只适用于 UDF,不适用于存储过程。它似乎在 SQL2008 R2 中不起作用
  • 这很像循环。我避免使用标量 udf,因为它们是逐行执行的。
【解决方案2】:

您可以有一个存储过程调用 select 来获取 ID,在结果列表上使用游标并为每个 ID 调用另一个过程。都在一个存储过程中。

【讨论】:

    【解决方案3】:

    如果一行产生一个结果:

    CREATE FUNCTION f(x int) RETURNS int AS BEGIN
        RETURN x * 2
    END
    GO
    SELECT id, x, dbo.f(x) FROM my_table
    

    如果一行可能产生多个结果:

    CREATE FUNCTION f(x int) RETURNS @r TABLE(result int) AS BEGIN
        INSERT INTO @r VALUES(x)
        INSERT INTO @r VALUES(x * 2)
        RETURN
    END
    GO
    SELECT t.id, t.x, r.result FROM my_table t CROSS APPLY dbo.f(t.x) r
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-14
      • 2019-02-18
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2018-08-09
      • 2015-10-05
      • 1970-01-01
      相关资源
      最近更新 更多