比较两个表并查找部分匹配(SQL/Oracle)
我还没有完全找到这个问题的答案,它似乎有点棘手(是的,我是一个初学者)。我有两张桌子比较两个表并查找部分匹配(SQL/Oracle),sql,join,wildcard,mismatch,Sql,Join,Wildcard,Mismatch,我还没有完全找到这个问题的答案,它似乎有点棘手(是的,我是一个初学者)。我有两张桌子eb_站点和eb_寄存器,它们都有一列连接它们的id_glo。虽然这些字段中的值不完全相同,但数字是连接因子。例如: eb_site=kplus.hs.dlsn.3074823 eb_register=kplus.hs.register.3074823-1“ 我如何选择那些(即列出eb_寄存器中的数字与eb_站点中的数字不同的地方)(并忽略dlsn/寄存器之间的不匹配) 而且,eb_寄存器的末尾有一个-1,如示例
eb_站点
和eb_寄存器
,它们都有一列连接它们的id_glo
。虽然这些字段中的值不完全相同,但数字是连接因子。例如:
eb_site=kplus.hs.dlsn.3074823
eb_register=kplus.hs.register.3074823-1“
我如何选择那些(即列出eb_寄存器中的数字与eb_站点
中的数字不同的地方)(并忽略dlsn/寄存器之间的不匹配)
而且,eb_寄存器
的末尾有一个-1,如示例所示(固定寄存器的末尾没有-1)
谢谢你的回复
编辑:哦,对不起,伙计们,用词不好,已经编辑了
Rgds
Steinar如果数字匹配,则数字的反方向匹配。下面使用SQL Server语法从每个键中提取数字(和小数点):
select *
from eb_site s join
eb_register r
on left(REVERSE(s.id_glo), charindex('.', reverse(s.id_glo))) =
left(REVERSE(r.id_glo), charindex('.', reverse(r.id_glo)))
在其他数据库中,
charindex()
可能需要用另一个函数替换,例如instr()
,location()
,或position()
解决方案的质量将取决于可能的id\u glo
值和您可以使用的sql方言。
首先,试试看
select s.id_glo
, r.id_glo
from eb_site s
inner join eb_register r on ( replace(replace(s.id_glo, 'kplus.hs.register.', ''), 'kplus.hs.dlsn.', '') <> replace(replace(r.id_glo, 'kplus.hs.register.', ''), 'kplus.hs.dlsn.', '')
and replace(replace(r.id_glo, 'kplus.hs.register.', ''), 'kplus.hs.dlsn.', '') not like replace(replace(s.id_glo, 'kplus.hs.register.', ''), 'kplus.hs.dlsn.', '') || '-%'
)
;
选择s.id\u glo
,r.id_glo
从eb_站点
内部连接eb_寄存器r打开(替换(替换(s.id_glo,'kplus.hs.寄存器','','kplus.hs.dlsn','')替换(替换(r.id_glo,'kplus.hs.寄存器','','','kplus.hs.dlsn','')
和replace(replace(r.id_glo,'kplus.hs.register.','','kplus.hs.dlsn.','')不同于replace(replace(s.id_glo,'kplus.hs.register.','','kplus.hs.dlsn.','')-%
)
;
此查询假定:
- 没有比您给定的前缀更多的不同前缀了
- 数字补码仅出现在
eb\u寄存器中的记录中
=
替换为
,因为这会标记不同的记录,而这些记录只在其-
相邻部分不同)。