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