首页 新闻 会员 周边

SQL比较两个表中相同字段的差异

0
悬赏园豆:30 [已解决问题] 解决于 2015-06-11 16:45

如有 A,B 两个表  都有id , cId , did 三个字段,

两个表中这三个字段的值应该对应的 

假如 A中, id =1,cId=2 ,did=3

  B 中, id =1,cId=2 ,did=3

这样的是正确的 ,

假如 两个表中这三个字段 至少一个没对应上 就是错误的,并列出来, 两个表中能对应上的不列出来

 

求高效的SQL 。。

 

备注: SQL SERVER

后缀名的主页 后缀名 | 初学一级 | 园豆:73
提问于:2015-06-02 17:28
< >
分享
最佳答案
-1

(select id, str = id+cid+did from A) as A1

将b也这样处理,然后用left join 和 right join来匹配。

收获园豆:10
幻天芒 | 高人七级 |园豆:37175 | 2015-06-02 17:35

这个思想很不错。。

后缀名 | 园豆:73 (初学一级) | 2015-06-11 16:43

@后缀名: 为什么没使用呢?

幻天芒 | 园豆:37175 (高人七级) | 2015-06-11 19:52
其他回答(5)
1

A : id =1,cId=2 ,did=3 

A : id =1,cId=2 ,did=4

B: id =1,cId=2 ,did=4
B: id =1,cId=2 ,did=5

 

这是2条记录还是3条记录?

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2015-06-02 17:33

两条, 1和 4列出来

支持(0) 反对(0) 后缀名 | 园豆:73 (初学一级) | 2015-06-02 17:37

@后缀名: 先查出合适的 然后not in 一下就好了

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2015-06-02 17:40

@小眼睛老鼠:      你用哪个字段not in ?    仔细想想, 这个not in 是不行的

支持(0) 反对(0) 后缀名 | 园豆:73 (初学一级) | 2015-06-02 18:35

@小眼睛老鼠: 感谢你昨天回复, 这个问题是求差级, 直接使用 EXCEPT 就可以了.

NOT IN 效率低 且 SQL SERVER 貌似不支持 多字段.

支持(0) 反对(0) 过于执著 | 园豆:339 (菜鸟二级) | 2015-06-03 09:04
1

select A.id,A.cid,A.did,B.id,B.cid,B.did from A,B

where (A.id == B.id) && (A.cid != B.cid or A.did != B.did) 

这个可以吗?没有测试,意思应该表达清楚了。

收获园豆:5
[0] | 园豆:1257 (小虾三级) | 2015-06-02 18:11
1

select * from a

intersect

select * from b

收获园豆:10
过于执著 | 园豆:339 (菜鸟二级) | 2015-06-03 08:56

错了 上面是交集, 差级关键字是 EXCEPT

支持(0) 反对(0) 过于执著 | 园豆:339 (菜鸟二级) | 2015-06-03 09:01

@过于执著: 

except也不地,这里是两个表没有的都要显示出来。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-06-05 12:06

@gw2010: 你不会  (select * from a except select * from b) union all (select * from b except select * from a) 吗?

支持(0) 反对(0) 过于执著 | 园豆:339 (菜鸟二级) | 2015-06-05 15:39

@过于执著: 晕,你上面是这样写的吗?回答问题有问题还事好来找。我不会吗?

我会啊,我下面已经写了,不过我不太会这么蠢的方式。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-06-05 15:42

@gw2010: 蠢蛋 自己测测速度,

支持(0) 反对(0) 过于执著 | 园豆:339 (菜鸟二级) | 2015-06-05 15:44

@过于执著: 你在叫我测的时候你自己有测过吗?

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-06-05 15:44

@gw2010: 以后不要回复了, 免得被鄙视,

支持(0) 反对(0) 过于执著 | 园豆:339 (菜鸟二级) | 2015-06-05 15:48

@过于执著: 是的,我经常被鄙视,你同我一个级别不是也被鄙视啊。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-06-05 15:48

@gw2010: 我确实很少在问博回答问题,数据库还是csdn论坛好玩些。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-06-05 15:48

@gw2010: 同一级别? 你是指园豆? 你的认知度就是这个啊?

支持(0) 反对(0) 过于执著 | 园豆:339 (菜鸟二级) | 2015-06-05 15:51

@过于执著: 看你回复的样子同我一个级别,不知道你是不是大牛,万一我看错了呢。

不过基本上不太会,如果你是大牛我就甘拜下风。哈哈。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-06-05 16:00

@过于执著: 我还真执着,我还真无聊,我做了一组数据来测试,不能说明所有问题,可以说明一点点吧。至少也可以说明我不是太蠢。数据是一样一半。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-06-05 16:13

@gw2010: 为了表示我的认真,上面其实有一些地方不一样。我的出了6列,有null的,而且在full join条件上没有做好处理,我相信实际数据应该比这个要好一些。但是我上传一个结果完全一样的可以看下。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-06-05 16:35

@gw2010: CPU执行时间长了, 磁盘读取时间短了, 你觉得哪个划得来?

估计你是没用过 交集并集差级吧, 我记得我的回复中有 C#实现交集差集的,

下面的供你课外阅读,

SELECT * FROM (
SELECT COUNT(DISTINCT ORDER_) OVER (PARTITION BY C1, C2, C3) ORDER_, C1, C2, C3 FROM (
SELECT 'A' ORDER_, C1, C2, C3 FROM A UNION ALL
SELECT 'B' ORDER_, C1, C2, C3 FROM B) ) WHERE ORDER_ = 1

支持(0) 反对(0) 过于执著 | 园豆:339 (菜鸟二级) | 2015-06-05 19:45

@过于执著: 你知道 基数 这个参数吗? join 的基数是多少?

支持(0) 反对(0) 过于执著 | 园豆:339 (菜鸟二级) | 2015-06-05 19:52

@过于执著: 真的正如你前面所说,越是说得多越看得出水平啊。

读取次数都显示出来了,你说磁盘读取时,我擦。

好了,大牛哥,你给我的课外阅读我拜读了。

你回复我我会弹出邮件的,所以我每次都会看到。如果后续还有什么疑问可以多交流哈,大牛哥。

支持(0) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-06-05 20:37

@gw2010:   你们俩真逗。。这世界就怕认真二字。

支持(0) 反对(0) 后缀名 | 园豆:73 (初学一级) | 2015-06-11 16:42
0

select * from a full join b on a.id1=b.id1 and a.id2=b.id2 and a.id3=b.id3

where a.id1 is null or b.id1 is null

试试

收获园豆:5
gw2010 | 园豆:1487 (小虾三级) | 2015-06-05 12:07

貌似不对啊

支持(0) 反对(0) 后缀名 | 园豆:73 (初学一级) | 2015-06-11 16:42

@后缀名: 不对可以指出来,你才逗。如果你正当的旨出来可能会少很多上面的口水战

支持(1) 反对(0) gw2010 | 园豆:1487 (小虾三级) | 2015-06-11 16:46

@gw2010: 亲,我错了,其次 ,真理越辩越明,不是口水战,那是为真理而辩

支持(0) 反对(0) 后缀名 | 园豆:73 (初学一级) | 2015-06-11 17:03
0

我用了笨办法 ,写程序一点点校验,光用sql脚本无法得到精准的结果,实在不敢用。 其中还有别的逻辑。

后缀名 | 园豆:73 (初学一级) | 2015-06-11 16:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册