【问题标题】:Oracle SQL- Add Column from second table if conditions for that row are metOracle SQL-如果满足该行的条件,则从第二个表添加列
【发布时间】:2020-09-11 12:05:23
【问题描述】:

如果表 1 中的列 A 和 B 与表 2 的行匹配列 A 和 B,我想从表 2 中引入列 C。

表 1

Column A         Column B
ABC123           XX470000

表 2

Column A            Column  B              Column  C
ABC123,EFG123       XX470000,XX560000      Winner

查询:

Select * From
(
Select * From Table 1 
) T1.
(
Select * From Table 2 
) T2.

where T1.ColumnA in s2.ColumnA 
and T1.ColumnB in s2.ColumnB 
;

我尝试过“like”、“in”和“=”语句来匹配不同的表。 还有数千行我需要这个。

【问题讨论】:

    标签: sql oracle csv join select


    【解决方案1】:

    如果要检查 csv 列表中的每个值是否存在,则可以使用以下连接条件:

    select t1.*, t2.columnC
    from table1 t1
    inner join table2 t2 
        on  ',' || t2.columna || ',' like '%,' || t1.columna || ',%' 
        and ',' || t2.columnb || ',' like '%,' || t1.columnb || ',%' 
    

    但是,您应该真正修复架构并将 csv 字符串的每个值存储在单独的表行中(可能使用桥接表)。在表中存储分隔值以某种方式违背了关系数据库的目的。推荐相关阅读:Is storing a delimited list in a database column really that bad?

    【讨论】:

      【解决方案2】:

      一个选项是使用REGEXP_SUBSTR() 函数 SELECT .. FROM .. CONNECT BY level <= ... 使用 '[^,]+' 键入查询以拆分 ColumnA Table2 的值转换为以逗号分隔的子字符串,然后在匹配条件中与其他表的 ColumnA 值连接,以获得这些子字符串的完全匹配:

      SELECT t1.ColumnA, t2.ColumnC
        FROM
        (
          SELECT REGEXP_SUBSTR(t2.ColumnA,'[^,]+',1,level) AS ColumnA, ColumnC
            FROM Table2 t2
         CONNECT BY level <= REGEXP_COUNT(t2.ColumnA,',') + 1
            AND PRIOR sys_guid() IS NOT NULL
        ) t2
        JOIN Table1 t1
          ON t1.ColumnA = t2.ColumnA
      

      Demo

      【讨论】:

      • 没错,你是对的@GMB。我已经改变了风格。
      猜你喜欢
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2014-06-16
      相关资源
      最近更新 更多