Sql 加入值列表
我有两张桌子:Sql 加入值列表,sql,postgresql,Sql,Postgresql,我有两张桌子: ID|name1|fkey 1 |foo |345, 567 ID |name2 | 345|hello | 567|world | 789|bar | 因此,第一个表在一个单元格中有一个键列表。 如何联接这些表以获得以下结果: ID |name2|name1 345|hello|foo 567|world|foo 789|bar | <null> ID | name2 | name1 345 |你好|福 567 |世界|福 789巴 通常的联接不起
ID|name1|fkey
1 |foo |345, 567
ID |name2 |
345|hello |
567|world |
789|bar |
因此,第一个表在一个单元格中有一个键列表。
如何联接这些表以获得以下结果:
ID |name2|name1
345|hello|foo
567|world|foo
789|bar | <null>
ID | name2 | name1
345 |你好|福
567 |世界|福
789巴
通常的联接不起作用,因为列“fkey”包含键列表。使用split\u part()
和left join
select t2.*,a.name1 from t2 left join
(select id,name1, split_part(fkey,',',1) as key1
from t1
union
select id,name1, split_part(fkey,',',2) as key1
from t1
) a on a.key=t2.id
这是一种糟糕的数据格式。但你可以在Postgres中这样做:
select t2.*, t1.name1
from t2 left join
(t1 cross join lateral
regexp_split_to_table(t1.fkey, ', ') r(val)
)
on t2.id = r.val;
然后,修复您的数据结构,以便有一个合适的连接表 在postgresql中,如果列是数组,则可以执行以下操作
SELECT a.*
FROM table1 AS a
JOIN table2 AS b on a.id = ANY(b.column_array)
不要将数据存储为逗号分隔的项目,这只会给您带来很多麻烦!这不是一个好的设计。在MSSQL中,您现在可以使用内置函数拆分逗号上的字段,并选择解析值的位置。我不确定postgresql内置中是否存在这种情况,但我肯定有代码可以找到。这不是外键应该如何存储的。序列化FKs违背了使用RDBMS的目的。请使用表架构信息更新问题。具体来说,
fkey
是逗号分隔的字符串、postgres数组、json数组还是jsonb数组?这样存储数据的不是我。不幸的是,我不得不处理它。