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