Sql 将逗号分隔的值从联接插入到特定列中

Sql 将逗号分隔的值从联接插入到特定列中,sql,amazon-redshift,Sql,Amazon Redshift,在我的暂存表中有一个名为event\u list的列,它是数据类型的varchar,看起来像: 1,2,3,4,5,,... 我需要的是,通过使用JOIN函数,将查找表中的适当值插入到事实表中,用于上述ID value1,value2,value3,value4,value5,... 所以我试着做一个简单的连接,从查找表中获取值并插入到事实中,这显然不起作用 LEFT OUTER JOIN public.event AS "event" ON "carnivaldata".event_lis

在我的暂存表中有一个名为event\u list的列,它是数据类型的
varchar
,看起来像:

1,2,3,4,5,,...
我需要的是,通过使用
JOIN
函数,将查找表中的适当值插入到事实表中,用于上述ID

value1,value2,value3,value4,value5,...
所以我试着做一个简单的连接,从查找表中获取值并插入到事实中,这显然不起作用

LEFT OUTER JOIN public.event AS "event"
ON "carnivaldata".event_list = "event".id
在上面的查询中,我试图根据staging中的
event\u list
列和
event
查找表中的
id
字段进行连接。但结果是空的

我哪里做错了?这是正确的方法吗?任何帮助都将不胜感激

编辑

示例元数据

staging_table <--- staging table
event_list <----- column
1,2
23,24
5,6

event_list lookup table <--- lookup table
id  value
1   value1
2   value2
23  value23
24  value24
5   value5
6   value6

expected_fact_table <--- fact table (expected result)
event_list          <--- column
value1, value2
value23, value24
value5, value6

您可以将逻辑表示为:

SELECT el.value AS event_list
FROM public.staging_table st LEFT OUTER JOIN
     public.event_lookup el
     ON ',' || st.event_list || ',' LIKE '%,' || el.id || ',%';

我不确定这是否会有合理的性能。您确实需要更改数据结构。这种类型的操作肯定不适合Redshift(实际上,Postgres更好,因为您可以很容易地将值unest到不同的行中)。

您可以将逻辑表示为:

SELECT el.value AS event_list
FROM public.staging_table st LEFT OUTER JOIN
     public.event_lookup el
     ON ',' || st.event_list || ',' LIKE '%,' || el.id || ',%';

我不确定这是否会有合理的性能。您确实需要更改数据结构。这种类型的操作肯定不适合Redshift(实际上,Postgres更好,因为您可以很容易地将值unest到不同的行中)。

您可以尝试以下动态查询

DECLARE @event_list nvarchar(MAX) = N'SELECT event_list FROM public.staging_table WHERE id = 3'

DECLARE @insert nvarchar(MAX) = N'
INSERT INTO public.fact_table (event_list)
SELECT value FROM public.event_lookup WHERE id in (' + @event_list +')'

EXEC sp_executesql @INSERT

您可以尝试以下动态查询

DECLARE @event_list nvarchar(MAX) = N'SELECT event_list FROM public.staging_table WHERE id = 3'

DECLARE @insert nvarchar(MAX) = N'
INSERT INTO public.fact_table (event_list)
SELECT value FROM public.event_lookup WHERE id in (' + @event_list +')'

EXEC sp_executesql @INSERT
根据,您可以使用
UNNEST(字符串到数组(标记“,”)
提取值,然后进行必要的连接,然后使用
STRING\u agg(表达式,分隔符)
您可以按所述进行连接
UNNEST(STRING\u TO\u ARRAY(tags),”)
提取值,然后进行必要的连接,然后使用
STRING\u agg(expression,delimiter)
可以按上述方法连接。

您不应该在一列中存储逗号分隔的值。(1)红移不是Postgres。(2) 提供样本数据和所需结果及其类型。(3) 您还可以包括完整的“简单连接”。@a_horse_与_no_name这实际上是客户的要求,因此我们无法对此进行任何更改。我使用的是红移,我认为
postgresql
与红移齐头并进。@GordonLinoff当然,我会在编辑中添加样本元数据,并分别添加到它们的类型和联接。@GordonLinoff我已经添加了样本数据,预期结果和联接查询。您不应该在一列中存储逗号分隔的值作为开始。(1)红移不是Postgres。(2) 提供样本数据和所需结果及其类型。(3) 您还可以包括完整的“简单连接”。@a_horse_与_no_name这实际上是客户的要求,因此我们无法对此进行任何更改。我使用的是红移,我认为
postgresql
与红移密切相关。@GordonLinoff当然,我会在编辑中添加示例元数据,并分别添加到它们的类型和连接中。@GordonLinoff我已经添加了示例数据、预期结果和连接查询。我尝试了上述方法,但只得到其中一个值,并非所有逗号分隔的值。从public.staging|u table cp internal join public.event ev on'、“| cp.event|u list | |”、“LIKE%”、“| ev.id | |”、“%”limit 2中选择ev.value作为elist,我是否遗漏了任何内容?我尝试了上述方法,但只得到了其中一个值,而不是所有逗号分隔的值。选择ev.value作为public.staging_表cp内部联接public.event ev on'、'| | cp.event_列表| | |'、'LIKE'、'| | ev.id | | |'、%'limit 2中的列表ev.value,此处是否缺少任何内容?