Bonjour,

J'ai un problème pour composer une jointure sur des conditions variables avec Oracle.

J'ai une table de résultats chimiques (près de 2 millions de lignes, exemple simplifié) pour des métaux, hydrocarbures, composés organiques, pesticides, etc.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
CREATE TABLE Resultat
(chemical_name NVARCHAR2(255),
 valeur NUMBER(30,15))
 
INSERT INTO Resultat (chemical_name, valeur) VALUES ('Plomb', 4)
INSERT INTO Resultat (chemical_name, valeur) VALUES ('Plomb dissous', 58)
INSERT INTO Resultat (chemical_name, valeur) VALUES ('Uranium', 0.5)
INSERT INTO Resultat (chemical_name, valeur) VALUES ('Zinc', 9)
INSERT INTO Resultat (chemical_name, valeur) VALUES ('Calcium dissous', 2541)
J'ai aussi une table de critères pour valider les résultats (environ 300 lignes)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
CREATE TABLE Critere
(SUBSTANCE NVARCHAR2(255),
 Scenario_1 NUMBER(30,15),
 Scenario_2 NUMBER(30,15))
 
INSERT INTO Critere (SUBSTANCE, Scenario_1, Scenario_2) VALUES ('Plomb', 5, 12)
INSERT INTO Critere (SUBSTANCE, Scenario_1, Scenario_2) VALUES ('Plomb dissous', 8, 10)
INSERT INTO Critere (SUBSTANCE, Scenario_1, Scenario_2) VALUES ('Zinc dissous', 15, 50)
INSERT INTO Critere (SUBSTANCE, Scenario_1, Scenario_2) VALUES ('Calcium dissous', 2000, 5000)
INSERT INTO Critere (SUBSTANCE, Scenario_1, Scenario_2) VALUES ('Nitrate', 10, 18)
Je veux un affichage où chaque résultat est accolé à ses critères (si applicable) pour comparaison ultérieure.
Tout ça fonctionne bien.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
SELECT chemical_name, valeur, substance, scenario_1, scenario_2 
FROM Resultat 
LEFT JOIN Critere 
ON chemical_name = substance
 
chemical_name	valeur	substance	scenario_1	scenario_2
_____________	______	_________	__________	__________
Plomb		4	Plomb		5		12
Plomb dissous	58	Plomb dissous	8		10
Uranium		0.5
Zinc		9
Calcium dissous	2541	Calcium dissous	2000		5000
J'ai besoin de modifier cette requête pour traiter des conditions particulières. Si un métal n'a pas de critères mais que des critères existent pour la version dissoute, je veux faire cette jointure (voir l'exemple du zinc).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
chemical_name	valeur	substance	scenario_1	scenario_2
_____________	______	_________	__________	__________
Plomb		4	Plomb		5		12
Plomb dissous	58	Plomb dissous	8		10
Uranium		0.5
Zinc		9	Zinc dissous	15		50
Calcium dissous	2541	Calcium dissous	2000		5000
La requête qui s'en approche est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
SELECT chemical_name, valeur, substance, scenario_1, scenario_2 
FROM Resultat 
LEFT JOIN Critere 
ON ((chemical_name = substance) OR (chemical_name || ' dissous' = substance))
mais certains résultats sont dédoublés (voir le plomb 4):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
chemical_name	valeur	substance	scenario_1	scenario_2
_____________	______	_________	__________	__________
Plomb		4	Plomb		5		12
Plomb 		4	Plomb dissous	8		10
Plomb dissous	58	Plomb dissous	8		10
Uranium		0.5
Zinc		9	Zinc dissous	15		50
Calcium dissous	2541	Calcium dissous	2000		5000

Comment composer cette jointure sans dédoubler les résultats de plusieurs métaux ?

Merci.
Christian