【问题标题】:SQL splitting a column and updating alternate tableSQL 拆分列并更新备用表
【发布时间】:2018-08-06 17:02:05
【问题描述】:

我正在处理几个不同的表格,这些表格包含来自用户对电影评分的数据。我的电影表当前列出了 MovieId、MovieTitle 和 Category。每个类别列中的数据在每一行中都有重复的组,我想通过将它们移到由 MovieId、CategoryId 组成的 MovieCategories 来消除它们。

我的类别栏使用 |作为分隔符,例如“Action | Thriller | Drama”。我有一个单独的表 CategoryDe​​scription ,它为每个类型分配一个 CategoryId,例如,我希望我的最终 MovieCategories 表如下所示:

 MovieId | CategoryId
------------------------
 1           1
 1           4
 1           7

等每部电影及其各自的流派。非常感谢任何帮助!

编辑:好的,我想要的结果是我上面的表格,列出了每部电影和每个单独的流派。例如,假设在我的电影表中我有:

MovieId   |   MovieTitle    | Category
  1            Toy Story        Animated | Childrens
  2            Die Hard         Action | Thriller

我希望我的 MovieCategories 表具有我的 Categories 表(列出 CategoryId 1-20 和每个相应的流派)中的 MovieId 和相应的 CategoryId,所以我在包含上述数据的最终表中的结果将是

 MovieId     |   CategoryId
 1                  1
 1                  4
 2                  3
 2                  5

希望这是有道理的!

再修改:

感谢到目前为止的 cmets 伙计们。我能够得到一个查询来产生几乎我想要的结果,但是我现在如何更新我的 MovieCategories 表?这是有效的查询:

 select distinct
    DUMMYMOVIES.MovieId,
    trim(regexp_substr(DUMMYMOVIES.CatDescription, '[^|]+', 1, 
   levels.column_value)) as Category
  from 
    DUMMYMOVIES,
    table(cast(multiset(select level from dual connect by  level <= 
   length (regexp_replace(DUMMYMOVIES.CatDescription, '[^|]+'))  + 1) as 
   sys.OdciNumberList)) levels
  order by MovieId;

这会正确拆分 Category 列,但是如何将其转移到我的 MovieCategories 表中?我可以使用 UPDATE 语句并让它运行此查询,对照我的 CategoryDe​​scription 表检查类别名称吗?

【问题讨论】:

  • 您使用的是什么 SQL?如果您使用的是 2016,则有一个内置的拆分功能。
  • 哦抱歉 - 应该指定。我正在使用 oracle SQL 开发人员。
  • 样本数据和期望的结果真的很有帮助。
  • 我用一些额外的信息编辑了我的帖子。
  • 它有点失控 - 我们正在偏离原始问题,并扩展它(不好的做法)。我建议一个问题 - 一个问题(如果需要)。不要在同一篇文章中堆叠更多问题。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

我创建了 2 个虚拟表电影和类别。填充样本数据和所需的输出。

电影表创建:

create table movie
(
movie_id varchar2(200),
movie_title varchar2(100),
category varchar2(100)
);

insert into movie values (1,'Toy Story','Animated | Childrens');
insert into movie values (2,'Die Hard','Action | Thriller');

类别表创建:

create table category
(
categoryid varchar2(100),
categoryname varchar2(100)
);


insert into category values (1,'Animated');
insert into category values (4,'Childrens');
insert into category values (3,'Action');
insert into category values (5,'Thriller');

主要查询:

select t1.movie_id,t2.CATEGORYID from
(
select distinct cat,movie_id from(
select trim(regexp_substr(category, '[^|]+', 1, LEVEL)) as cat,movie_id from movie  
CONNECT BY instr(category, '|', 1, LEVEL - 1) > 0)) t1
join
CATEGORY t2 on t1.cat = t2.categoryname;

希望对你有帮助

【讨论】:

    【解决方案2】:

    尝试即兴创作(背景中有尖叫的孩子) - 想出了解决方案(可能需要一些调整,但可能是一个好的开始):

    with tmp_tbl as(
      select
        1 MovieId,
        'Toy Story' MovieTitle,
        'Animated | Childrens' Category
      from dual
      union all
      select
        2 MovieId,
        'Die Hard' MovieTitle,
        'Action | Thrille' Category
      from dual
      union all
      select
        3 MovieId,
        'Beuty and the Beast' MovieTitle,
        'Musical | Comedy | Kids' Category
      from dual)
    select
      tmp_out.movieid,
      tmp_out.MovieTitle,
      trim(tmp_out.category_splited)
    from(
      select
        tmp.movieid,
        tmp.MovieTitle,
        regexp_substr(tmp.Category,'[^|]+', 1, level) category_splited
      from
        tmp_tbl tmp
      connect by
        regexp_substr(tmp.Category,'[^|]+', 1, level) is not null) tmp_out
    group by
      tmp_out.movieid,
      tmp_out.MovieTitle,
      tmp_out.category_splited
    order by
      tmp_out.movieid,
      tmp_out.category_splited
    

    输出:

    1   Toy Story             Animated
    1   Toy Story             Childrens
    2   Die Hard              Action
    2   Die Hard              Thrille
    3   Beuty and the Beast   Musical
    3   Beuty and the Beast   Kids
    3   Beuty and the Beast   Comedy
    

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 2021-01-08
      • 2013-10-08
      • 2018-07-15
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多