Sql 如何在oracle中创建包含多个select查询并返回多行的视图?
我在甲骨文里有一张这样的桌子 表名:链接Sql 如何在oracle中创建包含多个select查询并返回多行的视图?,sql,oracle,pivot,oracle-sqldeveloper,dynamic-pivot,Sql,Oracle,Pivot,Oracle Sqldeveloper,Dynamic Pivot,我在甲骨文里有一张这样的桌子 表名:链接 |url |category| |----------------|--------| |www.google.com |search | |----------------|--------| |www.facebook.com|Social | |----------------|--------| |www.twiter.com |Social | |----------------|--------| 我必须
|url |category|
|----------------|--------|
|www.google.com |search |
|----------------|--------|
|www.facebook.com|Social |
|----------------|--------|
|www.twiter.com |Social |
|----------------|--------|
我必须创建一个这样的视图
|search |Social |
|----------------|----------------|
|www.google.com |www.facebook.com|
|----------------|----------------|
| |www.twiter.com |
|----------------|----------------|
我尝试了以下sql
CREATE OR REPLACE VIEW v1 AS(
SELECT(
(SELECT * FROM Links WHERE category='Search'),
(SELECT * FROM Links WHERE category='Social')
) FROM Dual);
但它返回以下错误:
缺少右括号
当我尝试运行sql语句的以下部分时
SELECT(
(SELECT * FROM Links WHERE category='Search'),
(SELECT * FROM Links WHERE category='Social')
) FROM Dual;
它返回以下错误:
单子查询返回多行
请有人帮帮我。如果可能的话,也请告诉我。
谢谢您可以使用包含分析函数的
PIVOT
子句行号()
如果SELECT
语句是由这一部分CREATE或REPLACE VIEW v1 AS
前置的,那么您将拥有一个名为v1
的新数据库视图,通过
SELECT * FROM v1
更新:您仍然可以选择使pivot动态,与当前的不同类别值相对应。创建一个函数(或过程),包括REFCURSOR
,例如
CREATE OR REPLACE FUNCTION Get_Categories_RS RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_str VARCHAR2(32767);
BEGIN
SELECT LISTAGG( ''''||category||''' AS "'||LOWER(category)||'"' , ',' )
WITHIN GROUP ( ORDER BY category )
INTO v_str
FROM (
SELECT DISTINCT category
FROM t
);
v_sql :=
'SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY url) AS rn
FROM t
)
PIVOT
(
MAX(url) FOR category IN ( '|| v_str ||' )
)
ORDER BY rn';
OPEN v_recordset FOR v_sql;
RETURN v_recordset;
END;
然后运行以下代码:
VAR rc REFCURSOR
EXEC :rc := Get_Categories_RS;
PRINT rc
从SQL Developer的命令行查看结果集。您可以使用包含分析函数的PIVOT
子句行号()
如果SELECT
语句是由这一部分CREATE或REPLACE VIEW v1 AS
前置的,那么您将拥有一个名为v1
的新数据库视图,通过
SELECT * FROM v1
更新:您仍然可以选择使pivot动态,与当前的不同类别值相对应。创建一个函数(或过程),包括REFCURSOR
,例如
CREATE OR REPLACE FUNCTION Get_Categories_RS RETURN SYS_REFCURSOR IS
v_recordset SYS_REFCURSOR;
v_sql VARCHAR2(32767);
v_str VARCHAR2(32767);
BEGIN
SELECT LISTAGG( ''''||category||''' AS "'||LOWER(category)||'"' , ',' )
WITHIN GROUP ( ORDER BY category )
INTO v_str
FROM (
SELECT DISTINCT category
FROM t
);
v_sql :=
'SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY url) AS rn
FROM t
)
PIVOT
(
MAX(url) FOR category IN ( '|| v_str ||' )
)
ORDER BY rn';
OPEN v_recordset FOR v_sql;
RETURN v_recordset;
END;
然后运行以下代码:
VAR rc REFCURSOR
EXEC :rc := Get_Categories_RS;
PRINT rc
通过SQL Developer的命令行查看结果集。如何才能避免硬编码的类别值“social”和“search”?这些值将动态填充,并且可能会更改。我如何才能摆脱“社交”和“搜索”类别值的硬编码?这些值将动态填充,并且可能会更改。