主题:请教下关于两表内容的精确比较
coffeenight
[专家分:230] 发布于 2010-02-02 16:28:00
我用下面这条语句
SELECT a.* from cj_第二稿 a,cj_第一稿 b where a.ksbh=b.ksbh and a.ywk2<>b.ywk2
后来发现该语句 对 A 表中 ywk2 原来是null 到 A 表被改成 -1 的情况无效
该怎么办?
谢谢指导
最后更新于:2010-02-03 11:19:00
回复列表 (共13个回复)
沙发
狐说八道 [专家分:860] 发布于 2010-02-02 17:06:00
不知道是不是这个意思:
a.ywk2<>b.ywk2
改成:
iif(isnull(a.ywk2), -1, a.ywk2)<>b.ywk2
板凳
coffeenight [专家分:230] 发布于 2010-02-02 20:33:00
谢谢,楼上的朋友,原先我没表达清楚。我想表达的意思是
当原表中的字段是 NULL 时,新表相对应的字段无论被改成什么值,均无法被比较。
3 楼
狐说八道 [专家分:860] 发布于 2010-02-02 22:06:00
不是的,当原表中的字段是 NULL 时,新表相对应的字段改成-1就能比较了
4 楼
coffeenight [专家分:230] 发布于 2010-02-03 09:55:00
可是我要比较的就是原来和新表的差异
要看原表和新表有何不同
包括原表中原来是 null ,新表中变成 其它值的 情况
5 楼
狐说八道 [专家分:860] 发布于 2010-02-03 10:15:00
咱别捉猫猫了,你举些例子
6 楼
coffeenight [专家分:230] 发布于 2010-02-03 11:21:00
请看附件 ,通过查看我们可以看到有2条纪录被修改,但是查询时只能查到一条
附上select语句:
SELECT * from 新 a ,旧 b where a.ksbh=b.ksbh and a.ywk2<>b.ywk2
7 楼
狐说八道 [专家分:860] 发布于 2010-02-03 12:01:00
a.ksbh=b.ksbh and (a.ywk2<>b.ywk2 OR ISNULL(b.ywk2))
8 楼
coffeenight [专家分:230] 发布于 2010-02-03 15:51:00
a.ksbh=b.ksbh and (a.ywk2<>b.ywk2 OR ISNULL(b.ywk2))
不是的,我要显示的是两表之间不同数据,而不是b表的 ywk2 isnull
如果 a.ywk2 是 null 和b表一致,用你的语句也会显示出来,事实上这样的纪录我是不需要的
9 楼
狐说八道 [专家分:860] 发布于 2010-02-03 16:49:00
'举些例子'——‘些’你应该知道什么意思把?
可你例子只有各3条,能把你的意思表达清楚吗?
把你的情况列清楚可能早就解决了,你再组织下数据放上来?
10 楼
Ilikefox [专家分:5770] 发布于 2010-02-03 20:07:00
夜间咖啡,哇,不容易睡着。呵呵,玩笑一下。
恰巧俺还知道是怎么回事,说来看看。
NULL——这是个有趣的数据,表示“什么都没有”、“不知道是什么”,既然“不知道是什么”,把它和一个“知道是什么”的数据比较,结果还是“不知道是什么”。好比西瓜和南瓜比谁甜,当然西瓜甜,现在拿西瓜和“不知道是什么”比谁甜,你只能是“不知道是什么”。
说白了,NULL与非NULL数据进行关系运算,结果始终还是NULL。
? NULL>1
? NULL<1
? NULL<>"abc"
? NULL=NULL &&呵呵,两个NULL
以上结果都是 NULL
当这些表达式作为条件时,我们知道条件应该是“真”、“假”的结果,但是它们的结果是NULL。老狐狸判断时,干脆把“不知道是什么”认为是“假”。
8楼思路正确,不过要补充一点:
a.ksbh=b.ksbh and (a.ywk2<>b.ywk2 OR (ISNULL(b.ywk2) and not ISNULL(a.ywk2)))
我来回复