计算列引用另一个表中的行

时间:2019-02-28 15:59:08

标签: python sql sql-server database data-warehouse

我有一个表,其中的一列包含引用另一个表中项目的公式。带有公式的表格如下所示:

Formula
A+B
A*B-C
X+Y-Z
...

查找表如下所示

Id        Value   
A         10
B         200
C         75
...       ...

我想用公式导出表中的新列,并得出表达式的结果:

Formula     Result
A+B         210
A*B-C       135
X+Y-Z       5
...         ...

当前,这两个表放置在SQL数据库中,其中公式表非常小(大约3亿行),查找表非常大(也大约3亿行)。

欢迎使用除使用SQL之外的其他方法。实际上,只要能有效地完成工作,任何方法都可以。有处理任务的想法吗?

1 个答案:

答案 0 :(得分:0)

带有游标的SQL:

表格:

Create Table #formulas
(
f VarChar(25)
)

Insert Into #formulas Values
('A+B'),
('A*B-C'),
('X+Y-Z')

Create Table #v
(
id char(1),
v Int
)
Insert Into #v Values
('A', 10),
('B', 200),
('C', 75),
('X', 100),
('Y', 110),
('Z', 10)

Create Table #t
(
 f VarChar(25),
 v Float
)

使用游标遍历您的记录:创建动态SQL语句并执行到表#t中。

Declare @vStr nVarChar(50)
Declare @v1 nVarChar(20)
Declare @op1 nVarChar(20)
Declare @v2 nVarChar(20)
Declare @op2 nVarchar(20)
Declare @v3 nVarchar(20)

Declare vCursor Cursor For
   Select 
      (Select distinct v From #v Where id = Substring(f,1,1)) As 'v1', 
      Substring(f,2,1) As 'op1', 
      (Select distinct v From #v Where id = Substring(f,3,1)) As 'v2', 
      Substring(f,4,1) As 'op2', 
      (Select distinct v From #v Where id = Substring(f,5,1)) As 'v3'
   From #formulas;

Open vCursor
Fetch Next From vCursor Into
@v1,
@op1,
@v2,
@op2,
@v3

While @@FETCH_STATUS = 0
  Begin
      Set @vStr = Case When @v3 Is Null
      Then 'Select '''+ @v1 + @op1 + @v2 + ''',(' + @v1 + @op1 + @v2 + ')'
      Else 'Select '''+ @v1 + @op1 + @v2 + @op2 + @v3 + ''',(' + @v1 + @op1 + @v2 + @op2 + @v3 + ')'
      End
Insert Into #t(f,v)  Execute (@vStr) 
     Fetch Next From vCursor Into
       @v1,
       @op1,
       @v2,
       @op2,
       @v3
  End

   Close vCursor
   Deallocate vCursor

Select * From #t
   Drop Table #formulas
   Drop Table #v
   Drop Table #t

结果:

f           v
10+200      210
10*200-75   1925
100+110-10  200