【问题标题】:Join with like and prevent multiple results加入喜欢并防止出现多个结果
【发布时间】:2022-01-15 06:43:42
【问题描述】:

我想加入 2 个表并在加入时使用 like 搜索值(仅比较前 4 个字符串)。但结果应该只有 1:1,我想防止主表中的 1 个条目出现多个结果。

标签1

name
jackson
michael

tab2

name code
JACK 12345
JACK X 67890
Micha 12000
Michael T. 90000

结果

name_tab1 code_tab2
jackson 12345
michael 12000

对于 tab1 中的每个条目,我得到多个结果。

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

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    如果您不介意使用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
    

    【讨论】:

    • 谢谢。我也可以将 max 用于 char 列吗?
    • 当然,你可以..
    • 但是,现在因为它的分组,我没有得到 tab1 中所有重复条目的结果。
    • 通常,您不会在结果中保留完全相同的记录,因为它没有多大用处。如果您确定需要它,您可以在tab1 中添加一个用于区分重复条目的附加列,并将此列添加到group 子句中。
    【解决方案2】:

    试试这个:

    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
    
    NAME CODE
    jackson 12345
    michael 12000
    Jack Daniels 12345
    Michelin 12000

    dbfiddle link

    【讨论】:

    • 一如既往,您是这个社区的资产。谢谢!
    猜你喜欢
    • 2012-08-18
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2012-09-07
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多