比较两个表并查找部分匹配(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寄存器中的记录中

这需要一个认真的重新设计。看看这个,这个问题还有很多改进的空间。谢谢,以前看过,我会重新阅读它谢谢你的回答,这个网站太棒了!目前没有访问数据库的权限,明天我会看一看连接条件是否匹配了具有相同数字的记录,而它应该这样做当数字不同时(不要将
=
替换为
,因为这会标记不同的记录,而这些记录只在其
-
相邻部分不同)。