SQL-用管道分隔的键连接

问题描述 投票:0回答:1

TABLE_A

 CARGO - HELPERS
 250 - 125|126|5|...(AS MANY AS THEY ARE ASSIGNED ON THE PROGRAM)

TABLE_B

 ID - NAME
 5 - JAKE
 125 - JOSH
 126 - MEGAN
 9001 - VEGETA
 10 - SPANISH INQUISITION

我如何加入表A和B来获得所有帮助过货物的人?

我需要编写一个函数吗?

我没有开发该程序。我正在创建一个仪表板,需要该信息。

使用ORACLE 11g DB

结论---已解决

经过一些朋友的研究和帮助,我能够获得在我的情况下可以使用的SQL。

SELECT CARGO, HELPERS
FROM TABLE_A
INNER JOIN table_b B ON B.ID IN (SELECT regexp_substr(HELPERS,'[^|]+', 1, level) 
                                 FROM dual 
                                 CONNECT BY regexp_substr(HELPERS,'[^|]+', 1, level) IS NOT NULL) 

使用正则表达式获取所有内容,直到第一个|,然后继续进行直到找不到另一个管道为止。解释不正确,但可以为您提供帮助。

sql database oracle join left-join
1个回答
1
投票

从某种意义上讲,这很容易:

...
from table_a a join table_b b 
               on '|' || a.helpers || '|' like '%|' || b.id || '|%'
...

但是,正如我在关于您的问题的评论中所说,更好的方法是修复数据模型(如果它在您的能力范围内)。您的TABLE_A不在“第一范式”中。难怪您很难编写此(简单的)联接。对于较少的琐碎任务,您会感到更加痛苦,更不用说执行缓慢,无法检查“帮助者”的有效性,等等。

© www.soinside.com 2019 - 2024. All rights reserved.