SQL*Loader 在单列中处理多个值

Posted

技术标签:

【中文标题】SQL*Loader 在单列中处理多个值【英文标题】:SQL*Loader handling multiple values in a single column 【发布时间】:2021-07-19 15:12:29 【问题描述】:

我有一个 CSV 数据文件,其中包含我想要加载到我的数据库结构中的数据。该 CSV 文件中的示例数据如下所示:

col1, col2, col3, "val1,val2,val3,val4,...", col5, col6, "val1,val2,val3,...", col8

正如您在上面的场景中看到的那样,数据由逗号分隔,c4 和 c7 列用逗号括起来,它们每个都包含多个值。基本上,我试图将这些多个值映射到多对多关系中。例如,假设上述 CSV 文件中的每一行都代表一部电影,而 col4 包含该电影的流派。现在我的模式中有一个名为“流派”的表和另一个表“Movie_Genre”,因此在加载数据时,我想将这些 col4 流派加载到“流派”表中,确保一个值不会重复并且相同有时间我想通过使用包含“movie_id”和“genre_id”的“Movie_Genres”表将存储在“Movies”表中的电影与“Genres”表中存储的流派进行映射。

如何在 SQLPLUS Oracle 11g Windows 平台上使用 SQL Loader 实现这一目标?

【问题讨论】:

按原样将数据加载到临时表并使用 sql 查询进行处理。 @Serg 好吧,我想这可能是因为我还没有尝试过,但我不能使用 SQL 加载器控制文件来实现这一点吗? 这种设计违反了数据规范化的第一种正常形式,即一列必须只包含一个值。这将导致未来的查询噩梦。要修复和创建多对多关系,您需要获取两个实体的 PK 并将它们放在一起以创建关联表。该表仅在描述关联本身时才具有属性。搜索一下,就清楚了。 【参考方案1】:
LOAD DATA
INFILE 'nameoffile.csv'
INSERT INTO TABLE Billing
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
col1,
col2
)

【讨论】:

你能解释一下你的答案吗? 可选的 by 子句将值保持在一起,但正如我上面提到的,这种设计很糟糕,会在以后给你带来麻烦。

以上是关于SQL*Loader 在单列中处理多个值的主要内容,如果未能解决你的问题,请参考以下文章

SQL 根据单列的不同值选择记录

将序列号转换为 SQL 中缺少值的单列

Oracle_PL/SQL 集合

sql子查询

SQL查询从具有相同列“名称”的其他两个表中获取具有不同值的单列“名称”[关闭]

通过 SQL LOADER 存储日期和时间值