免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1370 | 回复: 3
打印 上一主题 下一主题

看似简单,高手赐教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-05 13:31 |只看该作者 |倒序浏览
实例中,常常要求这样的结果。如两个表tableA、tableB其中有几个域是两个表对应的(不一定有主外键的关系),求tableA中这些域组合在tableB没有的记录。常常这些域未必都是能相互隐形转换的。  

例:tableA、tableB有两个相同的域(field1(char)、field2(int))

     我只能这样处理:select  * from tableA  where  (CONVERT(CHAR(6),field2)+field1)  not in(select (CONVERT(CHAR(6),field2)+field1) from tableB
    /*也可以exist构造子查询*/
对于上了一定数量级的表,这实在是受不了~~~~~~

如何优化处理常常困扰我,请赐教

论坛徽章:
0
2 [报告]
发表于 2003-07-12 19:43 |只看该作者

看似简单,高手赐教

not in 应当避免使用,感觉它有时会给出一些难以理解的结果。就算结果不错,除非两个表记录很少,否则速度极慢。不如将A表倒到一个临时表里,然后将临时表中与B表字段相重的记录删掉。可能是个笨办法,不过总比not in强。

论坛徽章:
0
3 [报告]
发表于 2003-07-13 17:00 |只看该作者

看似简单,高手赐教

同意楼上二位的观点,not in尽量别用,极容易引起服务器的进程阻塞,我可是吃过亏的
    如果你经常要用到这样的查询,可以考虑做个存储过程,使用临时表

论坛徽章:
0
4 [报告]
发表于 2003-07-15 18:45 |只看该作者

看似简单,高手赐教

可以改写为 not exists(  )
一:可以优化查询
二:SQL书写方便.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP