求SQL语句:查找出表一中的所有记录在表二中没有匹配的显示出来。

有两个表如下:

表格一
编码A
304520
1302
6478902
04680000

表格二
编码B
30.4520
13.0200
64.789 02

要求:查找出表一中的编码在表二的编码中不匹配的。
注明:
(1)表一中的编码A为全数字组成的字符串,表二中的编码B为‘数字+小数点+空格+汉字’组成的字符串。
(2)表一的编码A与表二的编码B去除“小数点/空格/汉字”后前几位相同的则算匹配。
比如:表一编码A的1302 与表二编码B的13.0200是前几位相同,算是匹配的,但要找出不匹配的。

按要求查询结果应为:
04680000 (表一中的编码A只有这一条在表二编码B中不匹配)

求SQL语句?(最好能一次查询出来,不要用临时表)

select * from 表格一 A
where 1 = 1 and not exists
(select C.B from (
select REPLACE(REPLACE(编码B, '.', ''), ' ', '') as B from 表格二) C
where PATINDEX('%'+A.编码A+'%', C.B) > 0)

其中用到了REPLACE函数把一些不要的字符给去掉,PATINDEX是用来判断一个字符串中是否包含了另一个字符串,并返回一个INT类型的数据!!

希望对你有帮助!追问

这个查询效率高一点。但感觉查询结果不完全正确。

我了解了下PATINDEX函数,在尝试改进查询语句,谢谢!

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-17
select * from T1 where A not in
(select nvl(substr(REGEXP_SUBSTR(B,'[0-9]+')||REGEXP_SUBSTR(B,'[0-9]+',1,2)||
REGEXP_SUBSTR(B,'[0-9]+',1,3)||REGEXP_SUBSTR(B,'[0-9]+',1,4),1,length(A)),' ')
from T2);
该语句只允许编码B有4段数字。
例如:64.789a02是3段数字,中间.和a相隔;
64.789a02b01是4段数字,中间.、a和b相隔。
如果5段,则增加REGEXP_SUBSTR(B,'[0-9]+',1,5)
如果6段,则增加REGEXP_SUBSTR(B,'[0-9]+',1,6),一次类推。
第2个回答  2012-10-17
能把表里的数据整成这样服了你了,都是字符串转来转去的,给你些思路吧~~不过效率不会高的

select * from 表1 a where not exists(
select * from (
select replace(cast(编码B as nvarchar(20)),'.','') as 编码B from 表2
) x where cast(replace(x.编码B,cast(a.编码A as nvarchar(20)),'0') as int)=0
)
第3个回答  2012-10-17
如果还有汉字应该直接查不出来,如果只有小数点和空格的话可以先将小数点和空格替换掉。
相似回答