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.
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 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)
Je veux un affichage où chaque résultat est accolé à ses critères (si applicable) pour comparaison ultérieure.
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)
Tout ça fonctionne bien.
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
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
La requête qui s'en approche est :
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
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 SELECT chemical_name, valeur, substance, scenario_1, scenario_2 FROM Resultat LEFT JOIN Critere ON ((chemical_name = substance) OR (chemical_name || ' dissous' = substance))
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
Partager