oraclesql—如果满足第二个表中的行的条件,则从该表中添加列

t40tm48m  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(335)

如果表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”和“=”语句来匹配不同的表。还有成千上万行我需要这个。

f3temu5u

f3temu5u1#

如果要检查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字符串的每个值存储在单独的表行中(可能使用桥接表)。在表中存储带分隔符的值以某种方式破坏了关系数据库的用途。推荐阅读:在数据库列中存储分隔列表真的那么糟糕吗?。

xfyts7mz

xfyts7mz2#

一种选择是使用 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

演示

相关问题