簡體   English   中英

如何根據另一個表中的值填充一個表中的空值,其中連接基於子字符串

[英]How do I populate null values in one table based on values in another, where the join is based on a substring

我有兩張桌子。 表 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 + '%'

葡萄酒類型示例

如果您在 LIKE 上加入,您將始終獲得交叉加入。 此外,您可能有一個名稱與表 B 中的多行匹配,然后需要更多邏輯來返回單個值。

如果表 B 中的數據大部分是穩定的,那么最好和性能最好的方法是一個巨大的 CASE,使用 SQL 創建,基本上是這樣的:

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

基於此,您還可以確定匹配的優先級。

我已經對 100KB 嵌套 CASE 進行了類似的匹配,效果很好。 對於穩定的數據,最好的情況是在數據發生變化時自動創建 SQL-UDF。

謝謝@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM