【问题标题】:Depending on column value, query different tables根据列值,查询不同的表
【发布时间】:2020-07-23 21:00:48
【问题描述】:

我有一个表 A,其中每个 IDENTIFIER 值都是唯一的。根据它是 CC 还是 DC,我需要将它与不同的表连接起来,例如,如果它的“CC_”我需要将其映射到表 B,如果它的“DC_”我需要将它映射到表 C。

表 A:

ID | IDENTIFIER
1  | CC_1234567
2  | DC_9494949

表 B:

ID| SOURCE.  |INSTRUMENT
7 | 1234567. | 545454

表 C:

ID  |  SOURCE  | INSTRUMENT
8   |. 9494949 |. 63636363

我希望结果如下所示:

IDENTIFIER | INSTRUMENT
CC_1234567 | 545454
DC_9494949 | 63636363

首先,我怎么能从“CC_1234567”得到“1234567”和 其次,在编写连接查询时,我会在最终结果表中获得其他列,例如 B.INSTRUMENT、C.INSTRUMENT。 表 A 中的每个 IDENTIFIER 仅映射到表 B 或表 C。

Select A.IDENTIFIER, B.INSTRUMENT, C.INSTRUMENT 
from table.A 
inner join table.A on A.IDENTIFIER=B.INSTRUMENT AND A.IDENTIFIER=C.INSTRUMENT

【问题讨论】:

  • SUBSTR(A.IDENTIFIER, 4) 跳过前 3 个字符,例如将CC_1234567 变成1234567

标签: mysql sql database string join


【解决方案1】:

你可以left join两次,然后在select子句中使用coalesce()

select a.identifier, coalesce(b.instrument, c.instrument) instrument
from tablea
left join tableb b on a.identifier = concat('CC_', b.source)
left join tablec c on a.identifier = concat('DC_', c.source)

如果两个表都有匹配,上面的查询优先考虑tableb

如果要排除两个表中不匹配的行,则可以添加以下where 子句:

where a.source is not null or b.source is not null

【讨论】:

    【解决方案2】:

    您可以像下面这样使用 UNION:

    SELECT 
        A.IDENTIFIER,
        B.INSTRUMENT  
    FROM
        A 
        INNER JOIN B 
            ON B.SOURCE = SUBSTR(A.IDENTIFIER, 4) 
    WHERE A.IDENTIFIER LIKE 'CC_' 
    UNION
    SELECT 
        A.IDENTIFIER,
        C.INSTRUMENT 
    FROM
        A 
        INNER JOIN C 
            ON C.SOURCE = SUBSTR(A.IDENTIFIER, 4) 
    WHERE A.IDENTIFIER LIKE 'DC_' ;
    

    根据“CC_”或“DC_”,您可以加入不同的表并使用 UNION 进行合并。

    【讨论】:

      【解决方案3】:

      试试这个:与长度相结合的正确函数应该可以为您提供一种方便的方法来去除这些。

      SELECT 
         a.identifier,
         coalesce(b.instrument, c.instrument) AS instrument
      FROM
           a LEFT JOIN b ON 
         right(a.identifier,length(a.identifier)-3) = b.source 
            LEFT JOIN c ON
         right(a.identifier,length(a.identifier)-3) = c.source;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-16
        相关资源
        最近更新 更多