如有 A,B 两个表 都有id , cId , did 三个字段,
两个表中这三个字段的值应该对应的
假如 A中, id =1,cId=2 ,did=3
B 中, id =1,cId=2 ,did=3
这样的是正确的 ,
假如 两个表中这三个字段 至少一个没对应上 就是错误的,并列出来, 两个表中能对应上的不列出来
求高效的SQL 。。
备注: SQL SERVER
(select id, str = id+cid+did from A) as A1
将b也这样处理,然后用left join 和 right join来匹配。
这个思想很不错。。
@后缀名: 为什么没使用呢?
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条记录?
两条, 1和 4列出来
@后缀名: 先查出合适的 然后not in 一下就好了
@小眼睛老鼠: 你用哪个字段not in ? 仔细想想, 这个not in 是不行的
@小眼睛老鼠: 感谢你昨天回复, 这个问题是求差级, 直接使用 EXCEPT 就可以了.
NOT IN 效率低 且 SQL SERVER 貌似不支持 多字段.
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)
这个可以吗?没有测试,意思应该表达清楚了。
select * from a
intersect
select * from b
错了 上面是交集, 差级关键字是 EXCEPT
@过于执著:
except也不地,这里是两个表没有的都要显示出来。
@gw2010: 你不会 (select * from a except select * from b) union all (select * from b except select * from a) 吗?
@过于执著: 晕,你上面是这样写的吗?回答问题有问题还事好来找。我不会吗?
我会啊,我下面已经写了,不过我不太会这么蠢的方式。
@gw2010: 蠢蛋 自己测测速度,
@过于执著: 你在叫我测的时候你自己有测过吗?
@gw2010: 以后不要回复了, 免得被鄙视,
@过于执著: 是的,我经常被鄙视,你同我一个级别不是也被鄙视啊。
@gw2010: 我确实很少在问博回答问题,数据库还是csdn论坛好玩些。
@gw2010: 同一级别? 你是指园豆? 你的认知度就是这个啊?
@过于执著: 看你回复的样子同我一个级别,不知道你是不是大牛,万一我看错了呢。
不过基本上不太会,如果你是大牛我就甘拜下风。哈哈。
@过于执著: 我还真执着,我还真无聊,我做了一组数据来测试,不能说明所有问题,可以说明一点点吧。至少也可以说明我不是太蠢。数据是一样一半。
@gw2010: 为了表示我的认真,上面其实有一些地方不一样。我的出了6列,有null的,而且在full join条件上没有做好处理,我相信实际数据应该比这个要好一些。但是我上传一个结果完全一样的可以看下。
@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
@过于执著: 你知道 基数 这个参数吗? join 的基数是多少?
@过于执著: 真的正如你前面所说,越是说得多越看得出水平啊。
读取次数都显示出来了,你说磁盘读取时,我擦。
好了,大牛哥,你给我的课外阅读我拜读了。
你回复我我会弹出邮件的,所以我每次都会看到。如果后续还有什么疑问可以多交流哈,大牛哥。
@gw2010: 你们俩真逗。。这世界就怕认真二字。
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
试试
貌似不对啊
@后缀名: 不对可以指出来,你才逗。如果你正当的旨出来可能会少很多上面的口水战
@gw2010: 亲,我错了,其次 ,真理越辩越明,不是口水战,那是为真理而辩
我用了笨办法 ,写程序一点点校验,光用sql脚本无法得到精准的结果,实在不敢用。 其中还有别的逻辑。