首页 > 解决方案 > 根据表 1 中字符串内容的条件连接两个表

问题描述

我有两个表,我通过将 Table_A 的“some_name”与 Table_B 的“j_name”匹配来加入它们。在少数情况下,我想根据以下标准加入:

这可能吗?

Table_A:
**AB  some_name     G_NAME      Status        some_time**
------------------------------------------------------------
AAA    Job1        xxxxxxxxx   Ended OK    2020-06-29 10:37:52
AAA    AB-Jobd     xxxxxxxxx   Ended OK    2020-06-29 10:37:52
BBB    AB-ADu001   xxxxxxxxx   Ended OK    2020-06-29 10:37:52
BBB    AB-Job2     xxxxxxxxx   Ended OK    2020-06-29 10:37:52
BBB    AB-FBb3     xxxxxxxxx   Ended OK    2020-06-29 10:37:52

Table_B:
**RM  j_name           desc            rand_time**
----------------------------------------------------
111   AB-Job2         Sometext    2020-06-29 06:30:51
111   AB-Job5         Sometext1   2020-06-29 09:31:52
222   LLu001          Sometext2   2020-06-29 09:34:11
222   QT001           Sometext4   2020-06-29 11:32:23
222   BMX-Jobd        Sometext4   2020-06-29 11:32:23

到目前为止,我还想附加上述条件:

SELECT a.some_name,a.some_time, b.desc
FROM Table_A a
LEFT JOIN Table_B b
ON 
(b.j_name IN (a.service_name, 'LL' || SUBSTR(a.some_name, instr(a.some_name, 'AD')+2 ,4)))
or
(b.j_name IN (a.service_name, 'BMX-' || a.some_name))
where a.some_name like 'AB-%' order by log_time desc

标签: oracle-sqldeveloper

解决方案


这似乎是一个相当不愉快的问题。

从您的示例中我看不出重命名有什么逻辑;它似乎只是一个硬编码的替换列表。

我会选择类似的东西:

SELECT *
FROM (
    SELECT some_name,
        CASE some_name
            WHEN 'AB-FBb3' THEN 'QT001'
            -- etc.
            ELSE some_name
        END AS j_name
    FROM Table_A
) AS a
    FULL OUTER JOIN Table_B b ON a.j_name = b.j_name

因为CASE子查询中的 可以很容易地看到重命名。


推荐阅读