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.