sql >> Database teknologi >  >> RDS >> Oracle

Optælling af rækker i en indre sammenføjning

Du behøver ikke en indre joinforbindelse til en dummy-tabel eller en analytisk funktion for at generere rækkenumrene; du kan bare bruge connect by (og dens tilsvarende niveaufunktion) på selve bordet, som sådan:

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

Hvis du har andre kolonner end ban_key i tabellens primærnøgle, skal du sørge for, at de er inkluderet i connect by-klausulens liste over prior <column> = <column> s. Dette er, så forbindelsen kan identificere hver række unikt, hvilket betyder, at den går lige over den række og ingen andre. PRIOR sys_guid() IS NOT NULL er påkrævet for at forhindre forbindelse med sløjfer i at forekomme.



  1. MySQL:er det muligt at group_concat flere rækker?

  2. Sådan ser du forespørgselshistorik i SQL Server Management Studio

  3. Adgang nægtet; du har brug for (mindst én af) SUPER-rettighederne til denne handling

  4. Hvordan renser (forhindrer SQL-injektion) dynamisk SQL i SQL Server?