Après avoir lu le sujet d'aujourd'hui 
«SQL. Tâches divertissantes », je me souvenais que je voulais depuis longtemps recommander un excellent livre pour le niveau avancé d'Oracle SQL de notre excellent spécialiste Oracle, Alex Reprintsev -« The Power of Oracle SQL ». Non seulement il est extrêmement utile en soi pour ceux qui veulent connaître Oracle SQL à un niveau élevé, mais il est également 
gratuit ! De plus, il existe des versions en russe et en anglais.
En général, des 
liens vers le livre lui-même .
Et pour 
discuter du livre lui-même avec l'auteur .
Et pour en semer quelques exemples de tâches:
- Composants connectés
 il y a un graphique non orienté (non directionnel) défini par une liste d'arêtes et
 nécessaire pour obtenir les composants connectés.
 
 Pour les données du tableau ci-dessous:
 
 create table edge(x1, x2) as select 10,20 from dual union all select 50,40 from dual union all select 20,30 from dual union all select 20,40 from dual union all select 60,70 from dual union all select 80,60 from dual union all select 20,90 from dual;
 
 Le résultat suivant est attendu (l'ordre de numérotation des composants n'est pas critique):
 
   X GRP 
 
 
- Ordonner les dépendances
 Considérons maintenant le problème sur un graphique dirigé (dirigé).
 Il existe une table avec des dépendances entre les objets qui ne contient pas de cyclique
 dépendances. Cependant, plusieurs chemins peuvent exister entre des paires de sommets, donc
 Une telle structure ne peut pas être appelée arbre.
 
  create table d(name, referenced_name) as (select null, 'a' from dual union all select null, 'd' from dual union all select 'a', 'b' from dual union all select 'd', 'b' from dual union all select 'b', 'e' from dual union all select 'b', 'c' from dual union all select 'e', 'c' from dual);
 
 Il est nécessaire de faire le tour de tous les objets dans le nombre minimum d'étapes, tandis qu'à chaque étape
 Vous pouvez contourner uniquement les objets pour lesquels tous les objets dépendants sont contournés. Autrement dit, le
 la première étape contourne les objets qui n'ont pas de dépendances; dans la deuxième étape, ceux qui dépendent
 des objets de la première étape et ainsi de suite. En d'autres termes, les dépendances de profondeur sont numérotées.
 
- Couvertures
 Supposons qu'il existe un tableau de la forme suivante:
 
  create table t_range(a, b) as (select 1, 15 from dual union all select 3, 17 from dual union all select 6, 19 from dual union all select 10, 21 from dual union all select 17, 26 from dual union all select 18, 29 from dual union all select 20, 32 from dual union all select 24, 35 from dual union all select 28, 45 from dual union all select 30, 49 from dual);
 
 b> a pour chaque paire a, b; un unique
 
 Il est nécessaire d'obtenir les segments (1:15), (17:26), (28:45), c'est-à-dire que nous partons de la ligne avec
 au minimum a , et prenez la ligne suivante de telle sorte que pour elle a soit supérieur à b de la ligne actuelle et ainsi
 plus loin.
 
- Chemins supérieurs
 Pour une table avec une liste de répertoires dans le système de fichiers, affichez uniquement ceux qui n'ont pas
 sous-répertoire.
 
  create table t_path(path) as select '/tmp/cat/' from dual union all select '/tmp/cata/' from dual union all select '/tmp/catb/' from dual union all select '/tmp/catb/catx/' from dual union all select '/usr/local/' from dual union all select '/usr/local/lib/liba/' from dual union all select '/usr/local/lib/libx/' from dual union all select '/var/cache/' from dual union all select '/var/cache/'||'xyz'||rownum||'/' from dual connect by level <= 1e6;
 
 Pour les données indiquées, le résultat sera:
 
  PATH