【问题标题】:How do I populate null values in one table based on values in another, where the join is based on a substring如何根据另一个表中的值填充一个表中的空值,其中连接基于子字符串
【发布时间】:2023-03-18 20:13:01
【问题描述】:

我有两张桌子。表 A 包含数千个葡萄酒类型为空的产品名称。表 B 包含数百种葡萄酒品种及其对应的葡萄酒类型。

我需要编写一个 Teradata SQL 查询,该查询将在表 A 产品名称中查找子字符串,并在表 B 品种字段中找到该子字符串,然后返回表 B 葡萄酒类型 - 以填充缺失的葡萄酒类型数据表 A。

如果您查看表 A 中的第一行,您会看到表 A.Wine Type 字段中应包含的内容的示例。产品名称 Brilliant Barossa Shiraz Six 包含子字符串“Shiraz”。这个子串存在于Table B Variety 字段中,我需要代码将对应的Table B.Wine Type 返回到Table A.Wine Type 即RED-WINE。

我尝试了以下方法只是为了获得一个基本的连接作为起点,但它不起作用。有什么想法吗?

sel *
from TABLE_A a
inner join TABLE_B b
on a.product_name like '%' + b.variety + '%'

【问题讨论】:

  • teradata 有没有在线编译器?我应该测试代码。
  • 请将示例数据以文本形式发布,以便其他人可以轻松使用。
  • Teradata 中的连接运算符是 ||,而不是 +。请记住,这可能会产生非常糟糕的性能。
  • 请注意,如图所示,您可能会有多个匹配项。例如,匹配LIKE '%SHIRAZ MATARO%' 的任何内容也将匹配LIKE '%SHIRAZ%'。并且总会有匹配还是需要外部连接?

标签: sql teradata teradata-sql-assistant


【解决方案1】:

如果您加入 LIKE,您将始终获得交叉加入。此外,您的名称可能与表 B 中的多行匹配,然后需要更多逻辑来返回单个值。

如果表 B 中的数据大部分是稳定的,那么最好和最高效的方法就是使用 SQL 创建一个巨大的 CASE,基本上是这样的:

select 'when product_name like ''%' || variety || '%'' then ''' || wine_type || ''''
from tableB

基于此,您还可以对匹配进行优先级排序。

我已经对 100KB 嵌套 CASE 进行了类似的匹配,表现良好。对于稳定的数据,最好的情况是在数据发生变化时自动创建 SQL-UDF。

【讨论】:

    【解决方案2】:

    感谢@dnoeth。交叉连接是我不记得的东西!下面的作品现在是一种享受。如果产品是混合的白葡萄酒和红葡萄酒,只需整理一下即可。但这相对容易做到。

    谢谢大家。

    sel product_name
    ,case when instr(upper(product_name),variety,1,1) > 0 then wine_type else null end as wine_type
    
    from
    
    (
    sel a.product_name, b.variety, b.wine_type
    from TABLE_A a
    cross join TABLE_B b
    ) a
    
    where case when instr(upper(product_name),variety,1,1) > 0 then wine_type else null end is not null
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      相关资源
      最近更新 更多