db2 加入“喜欢”并防止出现多个结果

e5njpo68  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(173)

我想连接2个表,并在连接中使用类似的搜索值(只比较前4个字符串)。但结果应仅为1:1,我想防止主表中的1个条目出现多个结果。
制表符1
| 姓名|
| - -|
| Jackson|
| 迈克尔|
选项卡2
| 姓名|代码|
| - -|- -|
| 千斤顶|小行星12345|
| 千斤顶X|小行星67890|
| 米夏|一万二千元|
| 迈克尔·T.|九万元|
测试结果
| 名称标签1|代码标签2|
| - -|- -|
| Jackson|小行星12345|
| 迈克尔|一万二千元|
对于tab 1中的每个条目,我得到了多个结果。

Select * from tab1
left outer join tab2 on lower(substr(tab1.name,1,4) like '%'||substr(trim(lower(tab2.name)),1,4)||'%'
s4n0splo

s4n0splo1#

试试看:

WITH 
  TAB1 (NAME) AS 
(
VALUES
  'jackson'
, 'michael'
, 'Jack Daniels'
, 'Michelin'
)
, TAB2 (NAME, CODE) AS 
(
VALUES
  ('JACK',       '12345')
, ('JACK X',     '67890')
, ('Micha',      '12000')
, ('Michael T.', '90000')
)
SELECT A.NAME, B.CODE
FROM TAB1 A
LEFT JOIN TABLE
(
SELECT B.CODE
FROM TAB2 B
WHERE 
  LOWER (SUBSTR (A.NAME, 1, 4)) 
  LIKE '%' || LOWER (SUBSTR (B.NAME, 1, 4)) || '%'
FETCH FIRST 1 ROW ONLY
) B ON 1 = 1

| 名称|代码|
| - -|- -|
| Jackson|小行星12345|
| 迈克尔|一万二千元|
| 杰克·丹尼尔斯|小行星12345|
| 米其林|一万二千元|
dbfiddle link

g9icjywg

g9icjywg2#

如果你不介意取code,你可以按name分组,取code/最小值,比如:

select tab1.name, max(tab2.code) 
from tab1
left outer join tab2 on lower(substr(tab1.name,1,4) like '%'||substr(trim(lower(tab2.name)),1,4)||'%'
group by tab1.name

相关问题