sql—高效地创建数据变体

btqmn9zl  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(304)

我有4个参数。我需要创建一个新的表来保存这4个参数的所有可能的变化。这是4个参数的示例:
原始参数:

p1  | p2  |  p3 |  p4 |  
=====+=====+=====+=====+
  8  |  8  |  8  |  8  |

新表应包含:

p1  | p2  |  p3 |  p4 |  
=====+=====+=====+=====+
  8  |  8  |  8  |  8  | The original raw  
  1  |  8  |  8  |  8  | One cell devided by 8 (4 rows overall)  
  8  |  1  |  8  |  8  |    
  8  |  8  |  1  |  8  |    
  8  |  8  |  8  |  1  |
  1  |  1  |  8  |  8  | Two cells divided by 8 (6 rows overall)  
  1  |  8  |  1  |  8  |    
  1  |  8  |  8  |  1  |    
  8  |  1  |  1  |  8  |    
  8  |  1  |  8  |  1  |           
  8  |  8  |  1  |  1  |           
  1  |  1  |  1  |  8  | Three cells divided by 8 (4 rows overall) 
  1  |  1  |  8  |  1  |    
  1  |  8  |  1  |  1  |    
  8  |  1  |  1  |  1  |    
  1  |  1  |  1  |  1  | All cells divided by 8 (1 row overall)

我正在寻找最有效的方法,因为下一个级别可能是使用5个参数(并执行各种数学运算)执行相同的操作。
我想使用while循环,但我不知道如何在列上“运行”,比如c/c++/java/python中的嵌套for循环。还有其他方法来创建它吗?有效的方法是什么?

icomxhvb

icomxhvb1#

这个 cross join 解决方案:

select *
from
    (values (8),(1)) as q1(p1)
    cross join
    (values (8),(1)) as q2(p2)
    cross join
    (values (8),(1)) as q3(p3)
    cross join
    (values (8),(1)) as q4(p4)
piah890a

piah890a2#

根据您的评论,您可以使用 apply :

select p1.p1, p2.p2, p3.p3, p4.p4
from t cross apply
     (values (t.p1, t.p1 / 8.0)) p1(p1) cross apply
     (values (t.p2, t.p2 / 8.0)) p2(p2) cross apply
     (values (t.p3, t.p3 / 8.0)) p3(p3) cross apply
     (values (t.p4, t.p4 / 8.0)) p4(p4) ;

注意:sql查询返回固定数量的列。如果需要处理数量可变的参数,则需要动态sql。
也就是说,如何处理您需要处理的任何特定数量的参数应该是显而易见的。

相关问题