Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在oracle中创建包含多个select查询并返回多行的视图?_Sql_Oracle_Pivot_Oracle Sqldeveloper_Dynamic Pivot - Fatal编程技术网

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”?这些值将动态填充,并且可能会更改。我如何才能摆脱“社交”和“搜索”类别值的硬编码?这些值将动态填充,并且可能会更改。