Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Zeilen in einem Inner Join aufzählen

Sie brauchen keinen inneren Join zu einer Dummy-Tabelle oder eine Analysefunktion, um die Zeilennummern zu generieren; Sie könnten einfach connect by (und die entsprechende Level-Funktion) auf der Tabelle selbst verwenden, etwa so:

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

Wenn Sie andere Spalten als ban_key im Primärschlüssel der Tabelle haben, müssen Sie sicherstellen, dass sie in der Liste der connect by-Klausel von prior <column> = <column> enthalten sind s. Auf diese Weise kann connect by jede Zeile eindeutig identifizieren, was bedeutet, dass es nur über diese Zeile und keine anderen geschleift wird. Die PRIOR sys_guid() IS NOT NULL ist erforderlich, um zu verhindern, dass eine Verbindung durch Schleifen auftritt.