如何在 SQL 中制定 FOR EACH 循环?

Posted

技术标签:

【中文标题】如何在 SQL 中制定 FOR EACH 循环?【英文标题】:How to formulate FOR EACH loop in SQL? 【发布时间】:2011-05-12 22:13:20 【问题描述】:

我正在开发一个目前适用于一个组/模式组合的 SQL 查询。但我希望此查询适用于所有组和模式。并且每个组合只包含一次。但在源数据中还有很多其他列,因此每个组合有不止一条记录。

所以我的源表结构是:

group   mode   p-val
-----   ----   ------
A       B      4.567
C       D      3.694

如何设置循环以遍历每个组/模式组合?而且我宁愿不使用游标!

【问题讨论】:

请按照之前的要求正确格式化您的帖子。循环在每个步骤中做什么?如果它本质上是程序性的,那么就没有特别的理由使用另一个循环结构而不是游标(因为它们是专门为遍历结果行而设计的)。最好的办法是以基于集合的方式重写它,但你给我们的信息完全为零。 您展示的是样本输入还是预期输出? @Thomas,这是示例输入。 【参考方案1】:

一个非常广泛和普遍的问题。这是一个广泛而笼统的答案。

首先,编写一个查询来提取您感兴趣的值的集合,这样每个集合都是唯一的。 SELECT DISTINCT...SELECT... GROUP BY... 建议自己。

这些数据可以存储为临时表、作为子查询包含在内,或者只是作为整个最终查询的一部分。最好的使用完全取决于您的工作。

接下来,使用此子集作为基础编写您的“主要”处理查询。类似于...FROM <theSubset> INNER JOIN <etc>

如果做得好(我并不是说这很容易),这种基于集合的方法的效果与通过程序循环实现的结果非常相似。

【讨论】:

对于我的问题的笼统性,我深表歉意。但这个问题很难完全解释。但是,我现在已经使用基于集合与游标的方法解决了这个问题!做了很多工作,但我能够循环通过一个 WHILE 循环来实现这个逻辑【参考方案2】:

这在 sql 中称为JOIN。即声明

SELECT * FROM table AS a JOIN table AS b;

结果

a | b | 4.5   | a | b | 4.5
a | b | 4.5   | c | d | 3.694
c | d | 3.694 | a | b | 4.5
c | d | 3.694 | c | d | 3.694

现在您拥有 [group,mode] 记录的所有组合。详细了解 Google 的 JOIN。

【讨论】:

以上是关于如何在 SQL 中制定 FOR EACH 循环?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server FOR EACH 循环

你如何在 EJS 中执行 for 循环/for each?

Java,如何在“for each”循环中获取当前索引/键[重复]

for-each 循环如何工作? [复制]

如何在已排序的 xsl:for-each 循环中访问前一个和下一个元素的值

为啥我的使用“for-each 循环”的线性搜索代码不适用于混合输入?