Oracle
 sql >> Base de données >  >> RDS >> Oracle

Énumérer des lignes dans une jointure interne

Vous n'avez pas besoin d'une jointure interne à une table factice ou d'une fonction analytique pour générer les numéros de ligne ; vous pouvez simplement utiliser connect by (et sa fonction de niveau correspondante) sur la table elle-même, comme ceci :

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

Si vous avez d'autres colonnes que ban_key dans la clé primaire de la table, vous devez vous assurer qu'elles sont incluses dans la liste de la clause connect by de prior <column> = <column> s. C'est ainsi que la connexion par peut identifier chaque ligne de manière unique, ce qui signifie qu'elle boucle juste sur cette ligne et pas sur les autres. Le PRIOR sys_guid() IS NOT NULL est nécessaire pour empêcher la connexion par boucles de se produire.