比较两个表并找到部分匹配(SQL / Oracle)

时间:2013-04-15 18:13:00

标签: sql join wildcard mismatch

我还没有找到这个问题的答案,看起来有点棘手(是的,我是初学者)。我有两张桌子; eb_siteeb_register,他们都有id_glo列连接它们。但这些字段中的值并不完全相同,数字是连接因素。一个例子:

eb_site = kplus.hs.dlsn.3074823

eb_register = kplus.hs.register.3074823-1"

我怎样才能选择那些,即列出一个列表,其中eb_register中的数字与eb_site中的数字不同(并忽略dlsn / register之间的不匹配)。

并且eb_register在结尾处的结尾为-1(固定的结尾处没有-1)。

感谢您的回复。

编辑:哎呀抱歉的家伙,措辞严厉,编辑了

RGDS,

Steinar

2 个答案:

答案 0 :(得分:0)

如果数字匹配,则数字的反向匹配。下面使用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()

答案 1 :(得分:0)

解决方案的质量取决于可能的id_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.', '') || '-%'
           )
         ;

此查询假定:

  • 没有比你给出的更多不同的前缀
  • 号码补充仅发生在eb_register
  • 的记录中