sql >> データベース >  >> RDS >> Oracle

Oracleで複数の行を返す複数のselectクエリを含むビューを作成するにはどうすればよいですか?

    PIVOTを使用できます 分析関数ROW_NUMBER()を含む句 :

    SELECT "search", "Social"
      FROM (
            SELECT t.*,
                   ROW_NUMBER() OVER (PARTITION BY category ORDER BY url) AS rn
              FROM t
            )
     PIVOT
        (
         MAX(url) FOR category IN ( 'search' AS "search", 'Social' AS "Social" )
        )
     ORDER BY rn
    

    SELECTの場合 ステートメントの前には、この部分がありますCREATE OR REPLACE VIEW v1 AS 、次に、v1という名前の新しいデータベースビューが表示されます。

    によってそのステートメントの内容を返す
    SELECT * FROM v1
    

    デモ

    更新: ピボットを動的にするオプションはまだあります 現在のものとは異なるカテゴリ値と比較してください。 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から 結果セットを表示するためののコマンドライン。




    1. すべての一般的なブラウザ用のPHP/JavaScript上の安全でカスタマイズ可能なオープンソースチャットエンジン

    2. EMR上のApacheSparkでPostgresqlJDBCソースを使用する

    3. PHP/Mysqlで重複するすべてのレコードを削除する方法

    4. MySqlデータをLatin1からUTF8に変換します