【问题标题】:Oracle SQL - How to show one to many relationship in a single row? [duplicate]Oracle SQL - 如何在一行中显示一对多关系? [复制]
【发布时间】:2015-09-25 00:15:00
【问题描述】:

我有一个名为 MY_MOVIES 的表,它有两列:MOVIES 和 GENRES,就像这样(关系是一部电影与多种类型的关系):

GENRE         MOVIE
----------    --------------           
ACTION        MOVIE1
DRAMA         MOVIE1
CRIME         MOVIE2
DRAMA         MOVIE2
CRIME         MOVIE3
DRAMA         MOVIE3
ACTION        MOVIE4
ADVENTURE     MOVIE4
FANTASY       MOVIE4
ANIMATION     MOVIE5
ADVENTURE     MOVIE5
COMEDY        MOVIE5

此表有超过 100000 行。

我正在尝试获得这样的输出:

MOVIES        GENRES
----------    -------------- 
MOVIE1        ACTION, DRAMA
MOVIE2        CRIME, DRAMA
MOVIE3        CRIME, DRAMA
MOVIE4        ACTION, ADVENTURE, FANTASY
MOVIE5        ANIMATION, ADVENTURE, COMEDY

我正在尝试像这样使用 PIVOT(稍后将 0 和 1 替换为流派的想法):

SELECT * FROM MY_MOVIES 
PIVOT (COUNT(MOVIE) FOR GENRE in (SELECT DISTINCT(GENRE) FROM MY_MOVIES) as MOVIE_GENRES

我一直认为我做错了。

【问题讨论】:

  • 你应该用你正在使用的数据库标记问题(假设是 Oracle,给定 PL/SQL 标签)。
  • 是的@GordonLinoff,我正在使用 Oracle。抱歉,下次我会标记它。

标签: sql oracle pivot string-concatenation


【解决方案1】:

假设您使用的是 Oracle(11gR2 或更高版本):

select movies,
       listagg(genre, ', ') within group (order by genre) as genres
from my_movies
group by movies;

【讨论】:

  • 感谢戈登它的完美! :)
  • 我有时会收到 ORA-01489 错误(字符串连接的结果太长),你知道它可能是什么吗? @戈登
  • @GordonShumway 。 . . listagg() 的硬性限制为 4,000。这是一个找到至少一种解决问题的方法的博客:blogs.oracle.com/datawarehousing/entry/…
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 2014-07-01
  • 2012-01-20
  • 2017-10-29
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多