Sql server 2008 从一个表插入到另一个表

Sql server 2008 从一个表插入到另一个表,sql-server-2008,Sql Server 2008,我正在处理一个未规范化的数据库,它无法规范化,因为我没有权限。问题是 我有两张桌子 总账账户 试算表 表的结构如下所示 总账账户空表或带有一些旧数据 试算表 现在我想做的是 从试算表中具有相应总账账号的试算表中获取不在总账账户表中的记录,其中试算表中相应gXXXX下的金额不为零 让我举个例子来解释一下。记住上面的表格,我想填写表格总账账户 总账账户 我尝试了此查询,但它只将捕获的第一条记录输入到gl_Account表中。我现在跳过了金额部分。。但这是必须的 insert into Gl_Acco

我正在处理一个未规范化的数据库,它无法规范化,因为我没有权限。问题是

我有两张桌子

总账账户 试算表 表的结构如下所示

总账账户空表或带有一些旧数据

试算表

现在我想做的是

从试算表中具有相应总账账号的试算表中获取不在总账账户表中的记录,其中试算表中相应gXXXX下的金额不为零

让我举个例子来解释一下。记住上面的表格,我想填写表格总账账户

总账账户

我尝试了此查询,但它只将捕获的第一条记录输入到gl_Account表中。我现在跳过了金额部分。。但这是必须的

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
提前谢谢。

试试这个

INSERT INTO Gl_Account (loc,gl_acct,HMISTOTAL)
  SELECT * FROM (
                SELECT trialBalance .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 LEFT JOIN GL_Account 
                    ON trialBalance.loc = GL_Account.loc
                  WHERE 
                    GL_Account.loc IS NULL
                  )
试试这个

INSERT INTO Gl_Account (loc,gl_acct,HMISTOTAL)
  SELECT * FROM (
                SELECT trialBalance .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 LEFT JOIN GL_Account 
                    ON trialBalance.loc = GL_Account.loc
                  WHERE 
                    GL_Account.loc IS NULL
                  )

这将获取您指定的结果:

SELECT  loc,
        gl_acct,
        CASE gl_acct
            WHEN '1101' THEN g1101 
            WHEN '1102' THEN g1102
            WHEN '1103' THEN g1103 
        END AS HMISTOTAL
FROM    trialBalance a
JOIN (
        VALUES  ('1101'), 
                ('1102'),
                ('1103')
        ) c(gl_acct) ON
        (a.g1101 <> 0 AND gl_acct = '1101') OR
        (a.g1102 <> 0 AND gl_acct = '1102') OR
        (a.g1103 <> 0 AND gl_acct = '1103')
WHERE   NOT EXISTS
(
    SELECT  1
    FROM    GL_Account x
    WHERE   x.loc = a.loc
)

我已经使用值行构造函数创建了一个包含要连接的值的特殊表。

这将获得您指定的结果:

SELECT  loc,
        gl_acct,
        CASE gl_acct
            WHEN '1101' THEN g1101 
            WHEN '1102' THEN g1102
            WHEN '1103' THEN g1103 
        END AS HMISTOTAL
FROM    trialBalance a
JOIN (
        VALUES  ('1101'), 
                ('1102'),
                ('1103')
        ) c(gl_acct) ON
        (a.g1101 <> 0 AND gl_acct = '1101') OR
        (a.g1102 <> 0 AND gl_acct = '1102') OR
        (a.g1103 <> 0 AND gl_acct = '1103')
WHERE   NOT EXISTS
(
    SELECT  1
    FROM    GL_Account x
    WHERE   x.loc = a.loc
)

我已经使用VALUES行构造函数创建了一个包含要联接的值的临时表。

如果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

如果您在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

我在想一个循环,但不知道怎么做。。光标可能。。不错的方法。我正在考虑一个循环,但我不知道怎么做。。光标可能。。不过方法不错。