sql >> Databáze >  >> RDS >> Oracle

Jak vytvořit zobrazení s více výběrovými dotazy, které vrátí více řádků v oracle?

Můžete použít PIVOT klauzule obsahující analytickou funkci 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

a pokud SELECT před příkazem je uvedena tato část CREATE OR REPLACE VIEW v1 AS , pak budete mít nový pohled na databázi s názvem v1 vrátí obsah tohoto příkazu do

SELECT * FROM v1

Ukázka

Aktualizace: Stále máte možnost učinit pivot dynamickým oproti nadcházejícím hodnotám jiných kategorií, než jsou ty současné. Vytvořte funkci (nebo proceduru) včetně REFCURSOR například;

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;

a poté spusťte tento kód:

VAR rc REFCURSOR
EXEC :rc := Get_Categories_RS;
PRINT rc

od SQL Developer 's Command Line, abyste viděli sadu výsledků.




  1. záměna klauzule WHERE s CHOP

  2. Zabránit uživateli upravovat stejný záznam

  3. Migrujte databázi z Postgresu do MySQL

  4. Vložte všechny hodnoty tabulky do jiné tabulky v SQL