从一个表插入另一个表

Ank*_*ail 1 sql-server-2008

我正在处理一个未规范化的数据库,由于我没有权限,因此无法规范化.问题是

我有两张桌子

  • Gl_Account
  • 试算平衡

表的结构就像

Gl_Account(空表或一些旧数据)

loc  |  gl_acct  |  HMISTOTAL
-------------------------------
     |           |
-------------------------------
Run Code Online (Sandbox Code Playgroud)

试算平衡

loc   |    g1101    |   g1102   | g1103
----------------------------------------
1400  |     20      |    30     |  0
----------------------------------------
1500  |     10      |    0      |  40
----------------------------------------
Run Code Online (Sandbox Code Playgroud)

现在我想做的是

取不在记录Gl_Account表从试算与各个GL_acct数表,其中各下量gXXXX(在试算)不为零

让我用一个例子解释一下.记住上面的表我想填写GL_Account表

GL_Account

 loc      |    gl_acct      |  HMISTOTAL
    ---------------------------------------
       1400  |      1101       |   20
    ---------------------------------------
       1400  |      1102       |   30
    ---------------------------------------
       1500  |      1101       |   10
    ---------------------------------------
       1500  |      1103       |   40
    ---------------------------------------
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这个查询,但只有捕获的第一个记录被输入到gl_accountt表中.我现在跳过了金额部分..但它是必需的.

insert into Gl_Account (loc,gl_acct,HMISTOTAL)
  select * from (
                select a.loc,
                 CASE
                 WHEN a.G1101 <> 0 THEN '1101'
                 WHEN a.G1102 <> 0 THEN '1102'
                 WHEN a.G1104 <> 0 THEN '1104'
                 WHEN a.G1151 <> 0 THEN '1151'
                 END AS gl_Acct
               '0' as HMISTOTAL
                  FROM trialBalance a where NOT EXISTS
                         (SELECT 1 from GL_Account b WHERE b.loc = a.loc)) ab
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Mar*_*shi 5

如果您在TrialBalance中的记录有限且记录不超过100万,最简单的方法是使用如下所示的union,但您也可以将其写为循环,我不知道哪个更有效率

Select loc,HMISTOTAL,gl_acct from(
SELECT   [Trial Balance].loc, [Trial Balance].g1101 AS HMISTOTAL, '1101' AS gl_acct
FROM         [Trial Balance] LEFT OUTER JOIN
                      [Gl_Account] ON [Trial Balance].g1101 = [Gl_Account].gl_acct AND [Trial Balance].loc = [Gl_Account].loc

Union
                      SELECT   [Trial Balance].loc, [Trial Balance].g1102 AS HMISTOTAL, '1102' AS gl_acct
FROM         [Trial Balance] LEFT OUTER JOIN
                      [Gl_Account] ON [Trial Balance].g1101 = [Gl_Account].gl_acct AND [Trial Balance].loc = [Gl_Account].loc

Union
                      SELECT   [Trial Balance].loc, [Trial Balance].g1103 AS HMISTOTAL, '1103' AS gl_acct
FROM         [Trial Balance] LEFT OUTER JOIN
                      [Gl_Account] ON [Trial Balance].g1101 = [Gl_Account].gl_acct AND [Trial Balance].loc = [Gl_Account].loc) x

where HMISTOTAL >0
Order By loc,HMISTOTAL
Run Code Online (Sandbox Code Playgroud)