日期:2014-05-17  浏览次数:20579 次

C# 数据库中两表比较,选出不同,插入变更表中
表A,表B,进行比较,他们的字段相同,都有ID(主键),value(一个数值),两表皆有可能为空表,或者两表中的数据行数不同。
将两表中ID相同的数据进行比较,比较它们的value值是否相同。如果相同,则不动。若不同,则取两个value的差值(绝对值)。
最后将ID,差值插入C表中。C表的字段也是ID和value还有一个机生成的确保唯一性的乱码字段,几个字段设置都不为空,也就是不能插入空值。
我想用一个SQL语句完成,求大家指导~



另外,我自己写了一个这样的语句,一般比较一条数据,都能插入成功,但是当两个表的数据数量不同时,就出错。错误提示,违反唯一的约束条件。
c# sql 表比较

------解决方案--------------------
select distinct a.id,abs(a.value-b.value) from A a inner join B b on a.id=b.id  where a.value<>b.value 你可以看下你自己的SQL查出來的結果,是那個重複了違反了Key值
------解决方案--------------------
INSERT INTO tbC(id,value,GUID)
SELECT t1.id,ABS(ISNULL(t1.VALUE,0)-ISNULL(t2.VALUE,0) AS VALUE, NEWID()
FROM tbA t1 
INNER JOIN tbB t2 ON t1.id=t2.id AND ISNULL(t1.VALUE,0)<>ISNULL(t2.VALUE,0)
WHERE NOT EXISTS(SELECT 1 FROM tbC WHERE id=t1.id)

------解决方案--------------------
--C表已经存在的ID,则更新
UPDATE C
SET C.VALUE = ABS(ISNULL(a.VALUE, 0) - ISNULL(b.VALUE, 0)),
gid = NEWID()
FROM 表A a
INNER JOIN 表b b
ON a.id = b.id
INNER JOIN 表c C
ON a.id = c.id
WHERE ISNULL(a.VALUE, 0) <> ISNULL(b.VALUE, 0)
AND NOT EXISTS
(
SELECT 1 
FROM dbo.表c C
WHERE c.id = a.id
)

--C表不存在的ID,则插入
INSERT INTO 表c(id, value, gid)
SELECT 
a.id, 
ABS(ISNULL(a.VALUE, 0) - ISNULL(b.VALUE, 0)),
NEWID()
FROM 表A a
INNER JOIN 表b b
ON a.id = b.id
WHERE ISNULL(a.VALUE, 0) <> ISNULL(b.VALUE, 0)
AND NOT EXISTS
(
SELECT 1 
FROM dbo.表c C
WHERE c.id = a.id
)

--如果是SQL SERVER 2008,还可以用MERGER语法来实现