初来乍到,送高分求一语句!!
两个表A B
table A{
sfzh varchar18
xm varchar 10
csrq varchar 8
jg varchar 10
flag int
}
table B{
SFZH varchar18
XM varchar 10
CSRQ varchar 8
JG varchar 10
}
A表中数据量1000余条,B表中数据量二百万条。
要求:
1、如果A.sfzh和B.SFZH都非空,将满足A.sfzh=b.SFZH的行找出来,同时将A中检索过的行中A.flag设置为1。
2、如果A.sfzh 和 B.SFZH 有一个为空,将满足A.xm=B.XM and A.csrq=B.CSRQ and A.jg=B.JG的行找出来,同时将A中检索过的行中A.flag设置为1。
请问如何高效构造此语句。
问题点数:80、回复次数:6Top
1 楼zjcxc(邹建)回复于 2006-03-06 12:42:34 得分 0
-- 找出满足条件的数据
select A.*
from A, B
WHERE (ISNULL(A.sfzh,'') <> '' and isnull(B.SFZH,'') <> '' and A.sfzh=b.SFZH)
or ((ISNULL(A.sfzh,'') = '' or isnull(B.SFZH,'') = '') and (A.xm=B.XM and A.csrq=B.CSRQ and A.jg=B.JG))
-- 设置标志
update a set flag=1
from A, B
WHERE (ISNULL(A.sfzh,'') <> '' and isnull(B.SFZH,'') <> '' and A.sfzh=b.SFZH)
or ((ISNULL(A.sfzh,'') = '' or isnull(B.SFZH,'') = '') and (A.xm=B.XM and A.csrq=B.CSRQ and A.jg=B.JG))
Top
2 楼cimzzxing()回复于 2006-03-06 13:01:38 得分 0
就是先联接后,再判断吗,谢谢邹老大了!
这种方法高效吗?各位还有什么好的方法?Top
3 楼cimzzxing()回复于 2006-03-06 19:34:14 得分 0
我试了一下,两个表个联结生成的表好大阿
能不能这样做?
类似于:select * from A where exists( select * from B where A.sfzh=B.SFZH)
就是先在A表中取一行,然后去和B表中的行去比,如果B表中SFZH不为空,则找出A.sfzh=B.SFZH的行,如果SFZH为空,则找出满足A.xm=B.XM and A.csrq=B.CSRQ and A.jg=B.JG的行。
不知道,这样怎么在一条语句中实现?Top
4 楼zjcxc(邹建)回复于 2006-03-06 19:36:47 得分 80
-- 找出满足条件的数据
select A.*
from A
WHERE exists(
select * from B
where ISNULL(A.sfzh,'') <> '' and isnull(B.SFZH,'') <> '' and A.sfzh=b.SFZH)
or ((ISNULL(A.sfzh,'') = '' or isnull(B.SFZH,'') = '') and (A.xm=B.XM and A.csrq=B.CSRQ and A.jg=B.JG)))
-- 设置标志
update a set flag=1
select A.*
from A
WHERE exists(
select * from B
where ISNULL(A.sfzh,'') <> '' and isnull(B.SFZH,'') <> '' and A.sfzh=b.SFZH)
or ((ISNULL(A.sfzh,'') = '' or isnull(B.SFZH,'') = '') and (A.xm=B.XM and A.csrq=B.CSRQ and A.jg=B.JG)))
Top
5 楼cimzzxing()回复于 2006-03-06 20:13:11 得分 0
原来是这样啊,谢谢老大了!Top
6 楼cimzzxing()回复于 2006-03-06 21:15:21 得分 0
邹老大,又有新的问题了?
select A.*
from A
WHERE exists(
select * from B
where ISNULL(A.sfzh,'') <> '' and isnull(B.SFZH,'') <> '' and A.sfzh=b.SFZH)
or ((ISNULL(A.sfzh,'') = '' or isnull(B.SFZH,'') = '') and (A.xm=B.XM and A.csrq=B.CSRQ and A.jg=B.JG)))
如何把B.SFZH也同时select出来,还有在这两张表中,如何建立索引能够提高速度?Top




