Sql 基于部分字符串匹配联接两个表

Sql 基于部分字符串匹配联接两个表,sql,hive,hiveql,Sql,Hive,Hiveql,我有两个表,我在其中保存haddop配置单元上的一些表的计数。 表1列:日期、表格、计数(表格名称小写) 我的第二个表具有相同的形状:date、table、count(其中表名为大写) 02/07/2018 TABLENAME1 200 02/07/2018 TABLENAME2 10 我想要张新桌子 Tablename\u T1 Tablename\u T2 CountT1 CountT2 DateT1 DateT2 表名1表名1 300 200 01/07/18 02/07/2018 表名

我有两个表,我在其中保存haddop配置单元上的一些表的计数。 表1列:日期、表格、计数(表格名称小写)

我的第二个表具有相同的形状:date、table、count(其中表名为大写)

02/07/2018 TABLENAME1 200
02/07/2018 TABLENAME2 10
我想要张新桌子

Tablename\u T1 Tablename\u T2 CountT1 CountT2 DateT1 DateT2
表名1表名1 300 200 01/07/18 02/07/2018
表名2表名2 100 0 01/07/18 02/07/2018

我尝试了这个查询,但它不起作用

选择*
从计数表a到计数表2 b
其中a.tablename类concat(“%”,b.tablename,“%”)


谢谢

如果a.nom_表有可预测的顺序,那么我们可以这样写

select *
from count_tables a, count_tables2 b
where substr(a.nom_table,7,length(a.nom_table))=lower(b.nom_table)
使用
instr()
函数

select *
  from count_tables  a
       inner join count_tables2 b on a.datet1=b.datet2
 where instr(a.tablename,b.tablename) > 0
如果不希望表
a
中的每个日期与表
b
中的每个日期重复,请在a.datet1=b.datet2上向联接条件
添加日期

也可以使用
locate(string substr,string str[,int pos])
函数:

where locate(b.tablename, a.tablename) > 0

它不起作用。第二个表的nom_table列中有大写字母。我根据您的要求编辑了我的查询。您能尝试一下吗。为什么您的意思是它不起作用。是语法错误吗?语法正确。输出完成。结果为0。我真的不知道问题在哪里。我想知道是否可以更改e查询日期的联接。表1在日期1,表2在日期2-1?感谢您的支持help@Dora当然可以。使用
date\u sub(b.date2,1)
对不起,我有这个错误“失败:ClassCastException org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableStringObjectInspector无法强制转换为org.apache.hadoop.hive.serde2.objectinspector.primitive.BooleanObjectInspector“@Dora请提供您的查询。例外情况表明您使用字符串代替布尔值。错误where语句可能此查询有效,但不给我第3天时间”从表1中选择*一个内部联接表2 b其中a.nom_table=较低(b.nom_table)和a.
日期子(b.
日期
,3);”
where locate(b.tablename, a.tablename) > 0