SQL-显示查询

SQL-显示查询,sql,oracle,csv,oracle-sqldeveloper,Sql,Oracle,Csv,Oracle Sqldeveloper,目前我正在测试一些查询和下面的查询 select DISTINCT GENRES FROM GENRES ; 显示: Genres 0 Action,Adventure,Romance 1 Drama 我将如何编写它,以便它以下面的格式显示输出 Genres 1 Action 2 Adventure 3 Romance 4 Drama 任何帮助都是有用的!谢谢这里有一种使用正则表达式和递归查询拆分csv字符串的方法: select distinct trim(regexp_subs

目前我正在测试一些查询和下面的查询

select DISTINCT GENRES
FROM GENRES ;
显示:

  Genres
0 Action,Adventure,Romance
1 Drama
我将如何编写它,以便它以下面的格式显示输出

  Genres
1 Action
2 Adventure
3 Romance
4 Drama

任何帮助都是有用的!谢谢

这里有一种使用正则表达式和递归查询拆分csv字符串的方法:

select distinct trim(regexp_substr(genre, '[^,]+', 1, level)) genre
from mytable
connect by instr(genre, ',', 1, level - 1) > 0
:


这是可行的,但如果以后输入更多的体裁。尽管有可行的解决方案,但您的数据模型本身仍然存在根本性缺陷。它违反了第一范式。此外,表和列具有相同的名称类型也是非常令人困惑的。您应该有3个表来对此数据建模:

SQL> CREATE TABLE MOVIES
  2     (MOVIE_ID NUMBER NOT NULL ENABLE,
  3      TITLE VARCHAR2(20 BYTE) NOT NULL ENABLE,
  4      DIRECTOR VARCHAR2(20 BYTE) NOT NULL ENABLE,
  5           CONSTRAINT MOVIES_PK PRIMARY KEY (MOVIE_ID)
  6     );

Table created.

SQL>
SQL> CREATE TABLE MOVIE_GENRES
  2     (GENRE_ID NUMBER NOT NULL ENABLE,
  3      GENRE_NAME VARCHAR2(20 BYTE),
  4           CONSTRAINT MOVIE_GENRES_PK PRIMARY KEY (GENRE_ID)
  5     );

Table created.

SQL>
SQL> CREATE TABLE LK_MOVIES_GENRES
  2     (LK_MOVIES_GENRES_ID NUMBER NOT NULL ENABLE,
  3      MOVIE_ID NUMBER NOT NULL ENABLE,
  4      GENRE_ID NUMBER NOT NULL ENABLE,
  5           CONSTRAINT LK_MOVIES_GENRES_PK PRIMARY KEY (MOVIE_ID),
  6           CONSTRAINT FK_MOVIES FOREIGN KEY (MOVIE_ID)
  7            REFERENCES MOVIES (MOVIE_ID) ENABLE,
  8           CONSTRAINT FK_GENRES FOREIGN KEY (GENRE_ID)
  9            REFERENCES MOVIE_GENRES (GENRE_ID) ENABLE
 10     );

Table created.

这是可行的,但是如果以后输入更多的类型,那么这个代码需要再次修改,对吗?@SulaymanKhan:这是一个递归查询,所以它是动态的。它从分隔字符串中提取所有类型,无论有多少。是的,我有一个电影表,我也没有显示,我的计划是添加另一个名为movie_ID的列,以显示与该电影ID匹配的类型。 | GENRE | | :-------- | | Action | | Adventure | | Romance | | Drama |
SQL> with genres (id, genres) as
  2    (select 0, 'Action,Adventure,Romance' from dual union all
  3     select 1, 'Drama' from dual
  4    )
  5  select rownum id,
  6    regexp_substr(genres, '[^,]+', 1, column_value) genres
  7  from genres cross join
  8       table(cast(multiset(select level from dual
  9                           connect by level <= regexp_count(genres, ',') + 1
 10                          ) as sys.odcinumberlist));

        ID GENRES
---------- --------------------
         1 Action
         2 Adventure
         3 Romance
         4 Drama

SQL>
SQL> CREATE TABLE MOVIES
  2     (MOVIE_ID NUMBER NOT NULL ENABLE,
  3      TITLE VARCHAR2(20 BYTE) NOT NULL ENABLE,
  4      DIRECTOR VARCHAR2(20 BYTE) NOT NULL ENABLE,
  5           CONSTRAINT MOVIES_PK PRIMARY KEY (MOVIE_ID)
  6     );

Table created.

SQL>
SQL> CREATE TABLE MOVIE_GENRES
  2     (GENRE_ID NUMBER NOT NULL ENABLE,
  3      GENRE_NAME VARCHAR2(20 BYTE),
  4           CONSTRAINT MOVIE_GENRES_PK PRIMARY KEY (GENRE_ID)
  5     );

Table created.

SQL>
SQL> CREATE TABLE LK_MOVIES_GENRES
  2     (LK_MOVIES_GENRES_ID NUMBER NOT NULL ENABLE,
  3      MOVIE_ID NUMBER NOT NULL ENABLE,
  4      GENRE_ID NUMBER NOT NULL ENABLE,
  5           CONSTRAINT LK_MOVIES_GENRES_PK PRIMARY KEY (MOVIE_ID),
  6           CONSTRAINT FK_MOVIES FOREIGN KEY (MOVIE_ID)
  7            REFERENCES MOVIES (MOVIE_ID) ENABLE,
  8           CONSTRAINT FK_GENRES FOREIGN KEY (GENRE_ID)
  9            REFERENCES MOVIE_GENRES (GENRE_ID) ENABLE
 10     );

Table created.