我需要将来自单独程序的大量数据插入到单个表中(在Oracle SQL Developer中)。这种数据传输将朝着一个方向进行,这意味着系统偶尔会在表中转储大量数据,从而取代以前的数据。因此,我不必担心能够更新单个字段。我也无法修改此系统将数据传输到我的表中的方式,这意味着我无法将其字段映射到我的列标题(它只是使用INSERT
后面的TRANSACTION_ID
s发送数据场景)。
我希望该表具有唯一的TRANSACTION_ID
列。但是,每个TRANSACTION_TYPE
可能有多个TRANSACTION_TYPE
,因此我会为每个ID收到多行,其中INSERT INTO TEST_TABLE (TRANSACTION_ID, TRANSACTION_TYPE) VALUES (1000, TT35)
INSERT INTO TEST_TABLE (TRANSACTION_ID, TRANSACTION_TYPE) VALUES (1000, TT40)
INSERT INTO TEST_TABLE (TRANSACTION_ID, TRANSACTION_TYPE) VALUES (1000, TT12)
INSERT INTO TEST_TABLE (TRANSACTION_ID, TRANSACTION_TYPE) VALUES (1001, TT12)
......etc.
不同。 e.g:
TRANSACTION_ID TRANSACTION_TYPES
-----------------------------------------
1000 TT35,TT40,TT12
1001 TT12
1002 TT40,TT23
我想将它们连接成一个用逗号分隔的单个字段,所以最终的表格如下:
MERGE
我意识到这会使数据失去正常化,但由于我不需要更新它,所以我并不过分担心。
我理解这样做的方法通常是使用INSERT
,但由于我遇到源系统的TRANSACTION_TYPE
操作,我无法使用它。是否可以使用触发器执行此操作?我在之前的尝试中遇到了变异表等错误。
最后的办法可能是将PIVOT
存储在一个单独的表中,处理数据,然后删除第二个表,但这似乎过于复杂了。
是否有一种直截了当的方式来做到这一点我错过了?
由于
答案 0 :(得分:0)
评论太长了。
您可能可以使用触发器执行此操作,但我不建议使用它。触发器需要替换insert
,有时会执行插入操作,有时会连接值。
另外两个选项。首先,将数据加载到临时表中,然后为您的进程创建一个新表。
第二种方法是忽略该问题,并在查询时使用list_agg()
将数据合并在一起。