sql >> Databasteknik >  >> RDS >> Oracle

Räkna upp rader i en inre sammanfogning

Du behöver inte en inre koppling till en dummy-tabell eller en analytisk funktion för att generera radnumren; du kan bara använda connect by (och dess motsvarande nivåfunktion) på själva bordet, som så:

WITH tst_dim_ban_selected AS (SELECT 1 ban_key, 'a' cust_fullname, 3 n FROM dual UNION ALL
                              SELECT 2 ban_key, 'b' cust_fullname, 4 n FROM dual)
-- end of mimicking your table with data in it. See SQL below
SELECT db.ban_key,
       db.cust_fullname,
       LEVEL row_num
FROM   tst_dim_ban_selected db
CONNECT BY LEVEL <= db.n
           AND PRIOR db.ban_key = db.ban_key -- assuming this is the primary key
           AND PRIOR sys_guid() IS NOT NULL;

   BAN_KEY CUST_FULLNAME    ROW_NUM
---------- ------------- ----------
         1 a                      1
         1 a                      2
         1 a                      3
         2 b                      1
         2 b                      2
         2 b                      3
         2 b                      4

Om du har andra kolumner än ban_key i tabellens primärnyckel måste du se till att de är inkluderade i connect by-satsens lista över prior <column> = <column> s. Detta är så att connect by kan identifiera varje rad unikt, vilket innebär att den går i loop precis över den raden och inga andra. PRIOR sys_guid() IS NOT NULL krävs för att förhindra att anslutning via loopar uppstår.



  1. Använder Oracle XMLType-kolumnen i viloläge

  2. Unik begränsningsöverträdelse under infogning:varför? (Orakel)

  3. VÄLJ IN med Oracle

  4. Det gick inte att uppdatera .mdf-databasen eftersom databasen är skrivskyddad (Windows-program)