Developpez.com

Télécharger gratuitement le magazine des développeurs, le bimestriel des développeurs avec une sélection des meilleurs tutoriels

Le SQL de A à Z

Exercices et travaux pratiques


précédentsommairesuivant

III. Exercices - 2° partie

III-A. Problème n° 11 - premiers

En partant d'une simple table contenant les nombre de 0 à 10000, sauriez vous en une seule requête obtenir tous les nombres premiers entre 1 et 10000 ?  

Pour cela repartons de la table générée à l'exercice 6 :

 
Sélectionnez
CREATE TABLE T_ENTIER_ENT 
(ENT_N INTEGER); 
 
Sélectionnez
INSERT INTO T_ENTIER_ENT VALUES (0); 
INSERT INTO T_ENTIER_ENT VALUES (1); 
INSERT INTO T_ENTIER_ENT VALUES (2); 
INSERT INTO T_ENTIER_ENT VALUES (3); 
INSERT INTO T_ENTIER_ENT VALUES (4);
INSERT INTO T_ENTIER_ENT VALUES (5); 
INSERT INTO T_ENTIER_ENT VALUES (6); 
INSERT INTO T_ENTIER_ENT VALUES (7); 
INSERT INTO T_ENTIER_ENT VALUES (8); 
INSERT INTO T_ENTIER_ENT VALUES (9);
... 
 
Sélectionnez
ENT_N
------
0 
1 
2 
3 
4 
5 
6 
7 
8 
9
... 

C'est plus facile que cela en à l'air, si l'on se souvient qu'un nombre premier est un nombre qui n'est divisible que par lui même et 1. Ou plutôt qu'un nombre qui n'est pas premier est divisible par un nombre compris entre 2 et lui-même moins un...

En l'occurrence, le résultat doit être le suivant :

 
Sélectionnez
ENT_N       
----------- 
0
1
2
3
5
7
11
13
17
19
23
29
31
... 

On pourra bien entendu disserter éternellement sur la fait que 0 est premier ou non ! Mais sauriez vous exprimer la solution en une seule requête ?

cliquez pour répondre et titrez votre mail " Problème n°11 - premiers "

III-B. Problème n° 12 - la traduction

Voici un probléme intéressant pour les utilisateurs d'applications multilingues. C'est à nouveau un internaute, Sylvain qui m'a posé une colle ! Voici ce que Sylvain à posté :
"Bonjour, j'ai une table avec trois colonnes : id, langue, titre avec comme clé (id, langue). Je voudrais faire une requête du genre :

 
Sélectionnez
SELECT titre, id, langue 
FROM   matable 
WHERE  "(langue='francais' ou alors langue='anglais' si n'existe pas en francais)" 

En gros, je veux les résultats, de préférence en francais, mais si il n'y a pas de ligne pour le français, alors je voudrais la ligne pour la langue anglaise."
Est-ce possible ?

Voici le jeu d'essais avec lequel j'ai travaillé :

 
Sélectionnez
CREATE TABLE T_TRADUCTION_TDR 
(TDR_ID      INTEGER, 
 TDR_LANGUE  VARCHAR(8),
 TDR_LIBELLE VARCHAR(256)); 
 
Sélectionnez
INSERT INTO T_TRADUCTION_TDR VALUES (1, 'Français', 'Erreur irrécupérable');
INSERT INTO T_TRADUCTION_TDR VALUES (1, 'Anglais',  'Fatal error'); 
INSERT INTO T_TRADUCTION_TDR VALUES (3, 'Français', 'Disque saturé'); 
INSERT INTO T_TRADUCTION_TDR VALUES (4, 'Anglais',  'Memory fault'); 

Quelques-uns de mes collègues ont trouvé d'élégantes solutions... Sauriez vous trouver au moins une façon de faire ?

Voici en tout cas le résultat attendu :

 
Sélectionnez
TDR_LIBELLE                TDR_ID      TDR_LANGUE 
-------------------------- ----------- ---------- 
Erreur irrécupérable       1           Français
Disque saturé              3           Français
Memory fault               4           Anglais 

A vos claviers !

cliquez pour répondre et titrez votre mail " Problème n°12 - traduction "

III-C. Problème n° 13 - scores

La question vient d'un forum. Étant anonyme, je vous la donne telle quelle :
"Je fait un petit QCM sur internet et je crée 2 tables dans ma base de données. L'une de ces tables contient les informations sur les sondés (nom,prénom,etc..) ainsi que leurs réponses à mes questions (table T_PANEL_PNL).  L'autre table contient, elle, les réponses justes à mes questions (T_REPONSES_RPS). J'aimerais savoir si il est possible à l'aide de requètes de comparer ces 2 tables, c'est à dire que j'aimerais comparer les réponses de mes sondès aux réponses justes afin de déterminer les scores..."

Voici le jeu d'essais utilisé :

 
Sélectionnez
CREATE TABLE T_PANEL_PNL
(PNL_NOM VARCHAR(16),
 PNL_REPONSE1 INTEGER,
 PNL_REPONSE2 INTEGER,
 PNL_REPONSE3 INTEGER,
 PNL_REPONSE4 INTEGER,
 PNL_REPONSE5 INTEGER); 

CREATE TABLE T_REPONSES_RPS
(RPS_REPONSE1 INTEGER, 
 RPS_REPONSE2 INTEGER, 
 RPS_REPONSE3 INTEGER, 
 RPS_REPONSE4 INTEGER, 
 RPS_REPONSE5 INTEGER); 
 
Sélectionnez
INSERT INTO T_PANEL_PNL VALUES ('Pierre',  1, 2, 3, 0, 0); 
INSERT INTO T_PANEL_PNL VALUES ('Paul',    1, 5, 3, 2, 1);
INSERT INTO T_PANEL_PNL VALUES ('Jacques', 0, 3, 3, 2, 2); 

INSERT INTO T_REPONSES_RPS VALUES (1, 4, 3, 2, 1); 

Sauriez vous trouver une réponse pour qu'en une seule requête apparaisse la réponse suivante :

 
Sélectionnez
PNL_NOM          BONNES_REPONSES  
---------------- --------------- 
Paul             4 
Pierre           2 
Jacques          2 

A vos claviers !

cliquez pour répondre et titrez votre mail " Problème n°13 - scores "

III-D. Problème n° 14 - tranches d'âge

C'est encore un anonyme qui me pose une question sur le forum SQLpro...

Bonjour,
Sur une table comprenant une date de naissance, je cherche à obtenir le nombre d'enregistrements dont les personnes ont de 1 jour à 18 ans, de 18 à 40 ans et les plus de 40 ans. Qui peut m'indiquer la requête à effectuer ?

Reprenons les données de l'exercice 5 :

 
Sélectionnez
CREATE TABLE T_CLIENT_CLI
(CLI_ID             INTEGER,
 CLI_NOM            VARCHAR(16),
 CLI_DATE_NAISSANCE DATE); 
 
Sélectionnez
INSERT INTO T_CLIENT_CLI VALUES (24, 'HESS',      '1984-08-30'); 
INSERT INTO T_CLIENT_CLI VALUES (25, 'CHATON',    '1938-12-31'); 
INSERT INTO T_CLIENT_CLI VALUES (26, 'PLATONOFF', '1960-03-29'); 
INSERT INTO T_CLIENT_CLI VALUES (27, 'LETERRIER', '1945-08-26'); 
INSERT INTO T_CLIENT_CLI VALUES (28, 'MONTEIL',   '1985-03-23'); 
INSERT INTO T_CLIENT_CLI VALUES (29, 'SPITHAKIS', '1956-03-31'); 
INSERT INTO T_CLIENT_CLI VALUES (30, 'ORELL',     '1996-01-27'); 
INSERT INTO T_CLIENT_CLI VALUES (31, 'MARTINET',  '1946-10-24'); 
INSERT INTO T_CLIENT_CLI VALUES (32, 'RAY',       '1979-12-20'); 
INSERT INTO T_CLIENT_CLI VALUES (33, 'TARSAC',    '1992-08-14'); 
INSERT INTO T_CLIENT_CLI VALUES (34, 'COULOMB',   '1963-01-01'); 
INSERT INTO T_CLIENT_CLI VALUES (35, 'SAVY',      '1942-10-03'); 
INSERT INTO T_CLIENT_CLI VALUES (36, 'DAVID',     '1922-09-19'); 
INSERT INTO T_CLIENT_CLI VALUES (37, 'FORGEOT',   '1989-09-13'); 
INSERT INTO T_CLIENT_CLI VALUES (38, 'BERGER',    '1946-10-16'); 
INSERT INTO T_CLIENT_CLI VALUES (39, 'DOUBLET',   '1961-03-02'); 
INSERT INTO T_CLIENT_CLI VALUES (40, 'MATHIEU',   '1990-02-24'); 
INSERT INTO T_CLIENT_CLI VALUES (41, 'MOURGUES',  '1953-01-14'); 
INSERT INTO T_CLIENT_CLI VALUES (42, 'PIERROT',   '1933-02-11'); 
INSERT INTO T_CLIENT_CLI VALUES (44, 'ZAMPIERO',  '1985-01-19'); 
INSERT INTO T_CLIENT_CLI VALUES (45, 'PASCOT',    Null        ); 
INSERT INTO T_CLIENT_CLI VALUES (46, 'MECHRI',    '1950-08-11'); 
 
Sélectionnez
CLI_ID      CLI_NOM          CLI_DATE_NAISSANCE
----------- ---------------- ------------------
24          HESS             1934-08-30 
25          CHATON           1938-12-31 
26          PLATONOFF        1960-03-29 
27          LETERRIER        1945-08-26 
28          MONTEIL          1935-03-23 
29          SPITHAKIS        1956-03-31 
30          ORELL            1956-01-27 
31          MARTINET         1946-10-24 
32          RAY              1939-12-20 
33          TARSAC           1942-08-14 
34          COULOMB          1963-01-01 
35          SAVY             1942-10-03 
36          DAVID            1922-09-19 
37          FORGEOT          1949-09-13 
38          BERGER           1946-10-16 
39          DOUBLET          1961-03-02 
40          MATHIEU          1940-02-24 
41          MOURGUES         1953-01-14 
42          PIERROT          1933-02-11 
44          ZAMPIERO         1945-01-19 
45          PASCOT           NULL
46          MECHRI           1950-08-11 

Le résultat de votre requête doit apparaître comme suit :

 
Sélectionnez
TRANCHE_MIN TRANCHE_MAX NOMBRE      
----------- ----------- ----------- 
0           18          6
18          40          4
40          9999        13 

Sauriez vous répondre à notre internaute et de façon générique, c'est à dire quelle que soit les futures tranches d'âge à gérer ?

cliquez pour répondre et titrez votre mail " Problème n°14 - tranches d'age "

III-E. Problème n° 15 - titres sans article

Dans les titres des livres (comme dans les titres des films)  il y a souvent un article (le, la les, un, une, des...) situé en tête qui parasite l'apparition des oeuvres dans l'ordre alphabétique. D'ou la question de notre internaute, "Bouchon", son nom de code sur le forum SQL de www.developpez.com, qui demande : "J'aimerais, s'il y a un article au début du titre ("LE","LA","L'"), que celui-ci soit retiré de la chaine et se retrouve à la fin de celle-ci et entre parenthèses."

 Voici notre jeu d'essais :

 
Sélectionnez
CREATE TABLE T_OUVRAGES_OVG 
(OVG_TITRE VARCHAR(64)); 
 
Sélectionnez
INSERT INTO T_OUVRAGES_OVG VALUES ('Le journal de Raymond'); 
INSERT INTO T_OUVRAGES_OVG VALUES ('Le vélo d''Alphonse'); 
INSERT INTO T_OUVRAGES_OVG VALUES ('Découvrir l''escalade'); 
INSERT INTO T_OUVRAGES_OVG VALUES ('L''âge du capitaine'); 
INSERT INTO T_OUVRAGES_OVG VALUES ('Comment dévisser la vis');
INSERT INTO T_OUVRAGES_OVG VALUES ('D''amour et d''eau fraiche'); 
Contenu de la table Résultat attendu
 
Sélectionnez
SELECT TITRES  FROM OUVRAGES 
 
Sélectionnez
??? 
 
Sélectionnez
TITRE
---------------------------------- 
Le journal de Raymond  
Le vélo d'Alphonse  
Découvrir l'escalade  
L'âge du capitaine  
Comment dévisser la vis 
D'amour et d'eau fraiche 
 
Sélectionnez
TITRE
---------------------------------- 
journal de Raymond (Le)  
vélo d'Alphonse (Le)  
Découvrir l'escalade  
âge du capitaine (L')  
Comment dévisser la vis
amour et d'eau fraiche (D') 

Une colle finalement assez facile. Je l'ai résolue en 10 minutes...  Sauriez vous être aussi performant que moi ???

Sauriez vous répondre à notre internaute ?

cliquez pour répondre et titrez votre mail " Problème n°15 - titres sans article "
 

III-F. Problème n° 16 - Tri des titres

Voici encore un problème de tri... Il m'a été posé par un internaute sur le forum SQL de www.developpez.com. Il pourrait être le suite de notre exercice précédent.
Notre internaute voulait trier les titres de ses livres par ordre aplhabétique et laisser tous ceux qui ne commençent pas par une lettre à la fin. Mais en plus il exige que les titres commençant par un chiffre soient positionnés par rapport à leur écriture en lettre... Autrement dit "2001 l'odyssée de l'espace', doit figurer après "Ben Hur" et avant "Double assassinat dans la rue morgue.  
Sauriez vous lui répondre ?

Exemple :

 
Sélectionnez
CREATE TABLE T_LIVRE_LVR 
(LVR_TITRE  VARCHAR(64)); 
 
Sélectionnez
INSERT INTO T_LIVRE_LVR VALUES ('À la recherche du temps perdu'); 
INSERT INTO T_LIVRE_LVR VALUES ('La bible') ;
INSERT INTO T_LIVRE_LVR VALUES ('2001 l''odyssée de l''espace');
INSERT INTO T_LIVRE_LVR VALUES ('Ben Hur');
INSERT INTO T_LIVRE_LVR VALUES ('Double assassinat dans la rue morgue');
INSERT INTO T_LIVRE_LVR VALUES ('Les trois mousquetaires'); 

Si vous avez brillament répondu à notre précédent puzzle, alors vous devriez solutionner celui là !

Voici le résultat attendu :

 
Sélectionnez
LVR_TITRE                                                        
---------------------------------------------------------------- 
À la recherche du temps perdu
Ben Hur
2001 l'odyssée de l'espace
Double assassinat dans la rue morgue
La bible
Les trois mousquetaires 

cliquez pour répondre et titrez votre mail " Problème n°16 - tri des titres "
 

III-G. Problème n° 17 - Appariement

Le terme appariement vient de mettre en paires, c'est à dire apparier. On dit appariement et et non apparition comme s'il s'agissait de fantôme par exemple...
Cette demande, qui m'a donné du fil à retordre, provient du forum SQL du site www.developpez.com que j'anime.
Il s'agit de récupérer les valeurs de la colonne A pour laquelle les données de la colonne B sont exactement les mêmes qu'une autre valeur de la colonne A.

 
Sélectionnez
CREATE TABLE T_PAIRE_PER  
(PER_1 CHAR(2),  
 PER_2 CHAR(2)); 
 
Sélectionnez
INSERT INTO T_PAIRE_PER VALUES ('A1', 'B1'); 
INSERT INTO T_PAIRE_PER VALUES ('A1', 'B2'); 
INSERT INTO T_PAIRE_PER VALUES ('A2', 'B1'); 
INSERT INTO T_PAIRE_PER VALUES ('A2', 'B3'); 
INSERT INTO T_PAIRE_PER VALUES ('A3', 'B1'); 
INSERT INTO T_PAIRE_PER VALUES ('A3', 'B3'); 
INSERT INTO T_PAIRE_PER VALUES ('A3', 'B7'); 
INSERT INTO T_PAIRE_PER VALUES ('A3', 'B4'); 
INSERT INTO T_PAIRE_PER VALUES ('A4', 'B1'); 
INSERT INTO T_PAIRE_PER VALUES ('A4', 'B3'); 
INSERT INTO T_PAIRE_PER VALUES ('A5', 'B2'); 
INSERT INTO T_PAIRE_PER VALUES ('A6', 'B1'); 
INSERT INTO T_PAIRE_PER VALUES ('A6', 'B4'); 
INSERT INTO T_PAIRE_PER VALUES ('A6', 'B7'); 
INSERT INTO T_PAIRE_PER VALUES ('A6', 'B3'); 
INSERT INTO T_PAIRE_PER VALUES ('A8', 'B1'); 
INSERT INTO T_PAIRE_PER VALUES ('A8', 'B4'); 
INSERT INTO T_PAIRE_PER VALUES ('A8', 'B7'); 
INSERT INTO T_PAIRE_PER VALUES ('A8', 'B3'); 
INSERT INTO T_PAIRE_PER VALUES ('A9', 'B1'); 
INSERT INTO T_PAIRE_PER VALUES ('A9', 'B4'); 
INSERT INTO T_PAIRE_PER VALUES ('A9', 'B8'); 
INSERT INTO T_PAIRE_PER VALUES ('A9', 'B3'); 

Pour bien comprendre le problème, nous allons analyser ensemble les deux premières valeurs de la colonne A. Démarrons avec la valeur 'A1'  de la colonne PER_1 :

 
Sélectionnez
PER_1 PER_2 
----- ----- 
A1    B1
A1    B2

A2    B1
A2    B3
A3    B1
A3    B3
A3    B7
A3    B4
A4    B1
A4    B3
A5    B2
A6    B1
A6    B4
A6    B7
A6    B3
A8    B1
A8    B4
A8    B7
A8    B3
A9    B1
A9    B4
A9    B8
A9    B3

Pour la valeur 'A1' de la colonne PER_1, 
la colonne PER_2 possède les valeurs :
'B1' et 'B2'.

Quelles sont les autres valeurs de PER_1
qui ont en regard les valeurs 'B1' et 'B2'
dans la colonne PER_2 ?  
 
Sélectionnez
PER_1 PER_2 
----- ----- 
A1    B1
A1    B2

A2    B1
A2    B3

A3    B1
A3    B3
A3    B7
A3    B4

A4    B1
A4    B3

A5    B2

A6    B1
A6    B4
A6    B7
A6    B3

A8    B1
A8    B4
A8    B7
A8    B3

A9    B1
A9    B4
A9    B8
A9    B3

Aucune autre valeur de PER_1
n'a simultanément les valeurs 
'B1' et 'B2' dans la colonne PER_2 

Analysons maintenant la valeur 'A2' de la colonne PER_1 :

 
Sélectionnez
PER_1 PER_2 
----- ----- 
A1    B1
A1    B2

A2    B1
A2    B3

A3    B1
A3    B3
A3    B7
A3    B4
A4    B1
A4    B3
A5    B2
A6    B1
A6    B4
A6    B7
A6    B3
A8    B1
A8    B4
A8    B7
A8    B3
A9    B1
A9    B4
A9    B8
A9    B3

Pour la valeur 'A2' de la colonne PER_1, 
la colonne PER_2 possède les valeurs :
'B1' et 'B3'.

Quelles sont les autres valeurs de PER_1
qui ont en regard les valeurs 'B1' et 'B3'
dans la colonne PER_2 ?  
 
Sélectionnez
PER_1 PER_2 
----- ----- 
A1    B1
A1    B2

A2    B1
A2    B3

A3    B1
A3    B3
A3    B7
A3    B4

A4    B1
A4    B3

A5    B2

A6    B1
A6    B4
A6    B7
A6    B3

A8    B1
A8    B4
A8    B7
A8    B3

A9    B1
A9    B4
A9    B8
A9    B3

'A3', 'A4', 'A6', 'A8' et 'A9' ont simultanément
les valeurs 'B1' et 'B3' dans la colonne PER_2
mais certaines occurrences ('A3', 'A6', 'A8' et 'A9')
ont en sus d'autres valeurs...
Seule la valeur A4 est donc à retenir. 

Ici les seuls résulats valables sont 'A2' avec 'A4', puis 'A3' avec 'A6' et 'A8'. En effet les données de la colonne PER_2 sont identiques pour 'A2' et 'A4' ('B1' et 'B3'). Les données de la colonne B sont aussi identiques pour 'A3', 'A6' et 'A8', (' B1', 'B3', 'B4', 'B7').
Le résultat doit donc être :

 
Sélectionnez
PER_1
----- 
A2 
A3 
A4 
A6 
A8 

Simple en apparence, ce problème s'avère en fin de compte assez complexe. Mais j'ai déjà commencé le travail de décortication pour vous mettre sur la voie...

cliquez pour répondre et titrez votre mail " Problème n°17 - appariement "



 

III-H. Problème n° 18 - Meilleure correspondance

Voici une question qui m'a été posée sur le forum SQL de www.developpez.com par neness...

Je possède une table T_ROUTE_RTE ainsi remplie :

 
Sélectionnez
CREATE TABLE T_ROUTE_RTE 
(RTE_DESTINATION VARCHAR(32),  
 RTE_CODE        CHAR(16)); 
 
Sélectionnez
INSERT INTO T_ROUTE_RTE VALUES ('albania-Mobile', '0035538');  
INSERT INTO T_ROUTE_RTE VALUES ('albania-Mobile', '0035569');  
INSERT INTO T_ROUTE_RTE VALUES ('albania-Mobile', '0035560');  
INSERT INTO T_ROUTE_RTE VALUES ('SFR-Mobile',     '0077280'); 
INSERT INTO T_ROUTE_RTE VALUES ('SFR-Mobile',     '0077390');  
INSERT INTO T_ROUTE_RTE VALUES ('BOUYGE_TEL',     '0078452'); 

Pour chaque RTE_DESTINATION, je recherche la partie de la colonne RTE_CODE dont les données sont communes dans le sens de lecture.  Notre quidam essaye donc de trouver les meilleures correspondances partielles de RTE_CODE communes à une même famille de RTE_DESTINATION. Notez qu'il s'agit d'ailleurs d'une opération proche d'un calcul d'agrégat...

Dans l'exemple donné, la requête doit renvoyer :  

 
Sélectionnez
RTE_DESTINATION      RTE_CODE 
-------------------- ---------------  
albania-Mobile       00355 
BOUYGE_TEL           0078452 
SFR-Mobile           0077 

En effet, '00355' est la plus grande partie commune commençant chaque RTE_CODE pour 'albania-Mobile', de même '0078452' pour 'BOUYGE_TEL' et de même '0077' pour 'SFR-Mobile'.
Autrementy dit, quelle est la partie de RTE_DESTINATION correspondant aux premiers caractères communs à chaque occurence de la colonne RTE_CODE.

Simple, mais comment faire ?

cliquez pour répondre et titrez votre mail " Problème n°18 meilleure correspondance "


 

III-I. Problème n° 19 - La médiane

Dans un forum consacré à SQL Server de Microsoft, j'ai trouvé cette question forte intéressante :
Bonjour,Je doit calculer des données statistiques et la médiane est absente...Comment cela peut il être réalisé en une requête ?.

Comme ce problème s'avère en définitif assez complexe, le voici exprimés pour différents cas...

1) les données à calculées sont toutes différentes (il n'y a pas de doublon) et en nombre impaires :
Voici le jeu de données que j'ai utilisé pour ce cas :  

 
Sélectionnez
CREATE TABLE T_STATISTIQUES_STT
(STT_ID     INT,
 STT_VALEUR FLOAT NOT NULL); 
 
Sélectionnez
INSERT INTO T_STATISTIQUES_STT VALUES (1, 22.0);
INSERT INTO T_STATISTIQUES_STT VALUES (2, 27.5);
INSERT INTO T_STATISTIQUES_STT VALUES (3, 22.5);
INSERT INTO T_STATISTIQUES_STT VALUES (4, 24.0);
INSERT INTO T_STATISTIQUES_STT VALUES (5, 23.0); 

La solution étant :

 
Sélectionnez
STT_VALEUR
----------
23.0 

2) les données à calculées sont toutes différentes (il n'y a pas de doublon) et en nombre paires :
Rajoutons au jeu précédent la ligne :

 
Sélectionnez
INSERT INTO T_STATISTIQUES_STT VALUES (6, 23.5); 

La solution devient :

 
Sélectionnez
STT_VALEUR 
----------
23.25 

3) voyons ce qu'il se passe avec des valeurs identiques multiples et un nombre de lignes impair :
Rajoutons au jeu précédent les lignes :

 
Sélectionnez
INSERT INTO T_STATISTIQUES_STT VALUES (7, 22.0);
INSERT INTO T_STATISTIQUES_STT VALUES (8, 22.0);
INSERT INTO T_STATISTIQUES_STT VALUES (9, 22.0);
INSERT INTO T_STATISTIQUES_STT VALUES (10, 22.0);
INSERT INTO T_STATISTIQUES_STT VALUES (11, 22.0); 

La solution devient :

 
Sélectionnez
STT_VALEUR
----------
22.0 

C'est le genre de problème qui a passionné les spécialistes de SQL que sont Joe Celko et Chris Date. Sauriez vous au moins traiter le cas n° 1 ?

cliquez pour répondre et titrez votre mail " Problème n°19 - mediane "


 

III-J. Problème n° 20 - Insertion en bloc

Voici un problème intéressant pour s'affanchir de certaines procédures stockées bêtes et méchante...Comment insérer de multiple ligne, par exemple dans une table de jointure, sans faire appel à une boucle et à l'aide d'une seule et unique requête ?

Notre problème est le suivant. Soit une table d'objets définie comme suit :

 
Sélectionnez
CREATE TABLE T_OBJET_OBJ
(OBJ_OBJET VARCHAR(16)); 
 
Sélectionnez
INSERT INTO T_OBJET_OBJ VALUES ('feu tricolore');
INSERT INTO T_OBJET_OBJ VALUES ('drapeau français'); 

... une table listant des couleurs :

 
Sélectionnez
CREATE TABLE T_COULEUR_CLR
(CLR_COULEUR   VARCHAR(8)); 
 
Sélectionnez
INSERT INTO T_COULEUR_CLR VALUES ('blanc');
INSERT INTO T_COULEUR_CLR VALUES ('bleu');
INSERT INTO T_COULEUR_CLR VALUES ('vert');
INSERT INTO T_COULEUR_CLR VALUES ('rouge');
INSERT INTO T_COULEUR_CLR VALUES ('orange'); 

... et une table de jointure associant les deux, table actuellement vide : 

 
Sélectionnez
CREATE TABLE T_OBJET_COULEUR_OBC
(OBJ_OBJET   VARCHAR(16),
 CLR_COULEUR VARCHAR(8)); 

Nous aimerions parvenir à remplir de la sorte la table d'association T_OBJET_COULEUR_OBC :

 
Sélectionnez
OBJ_OBJET        CLR_COULEUR 
---------------- ----------- 
feu tricolore    vert
feu tricolore    rouge
feu tricolore    orange
drapeau français blanc
drapeau français bleu
drapeau français rouge 

Sauriez-vous trouver en une seule requête comment procéder à l'insertion massive de ces six lignes ?

cliquez pour répondre et titrez votre mail " Problème n°20 - insertion en bloc "


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © SQLPro. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.