Bonjour,

Je sèche sur un petit problème qui doit être resolvable proprement.

J'ai :
- une table contenant un Id et un Nom appelée Agents
- une table contenant un Id, un Nom, un Taux appelée Produits
- une table contenant un Id, un Id_agent, un Id_produit, un taux appelée Taux

Voici un exemple de la base de données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
--
-- Structure de la table `agents`
--
 
CREATE TABLE IF NOT EXISTS `agents` (
  `id` int(11) NOT NULL auto_increment,
  `nom` varchar(25) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
 
--
-- Contenu de la table `agents`
--
 
INSERT INTO `agents` (`id`, `nom`) VALUES
(1, 'Agent 1'),
(2, 'Agent 2');
 
-- --------------------------------------------------------
 
--
-- Structure de la table `produits`
--
 
CREATE TABLE IF NOT EXISTS `produits` (
  `id` int(11) NOT NULL auto_increment,
  `nom` varchar(25) NOT NULL,
  `taux` float NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
 
--
-- Contenu de la table `produits`
--
 
INSERT INTO `produits` (`id`, `nom`, `taux`) VALUES
(1, 'Produit 1', 5),
(2, 'Produit 2', 10);
 
-- --------------------------------------------------------
 
--
-- Structure de la table `taux`
--
 
CREATE TABLE IF NOT EXISTS `taux` (
  `id` int(11) NOT NULL auto_increment,
  `id_agent` int(11) NOT NULL,
  `id_produit` int(11) NOT NULL,
  `taux` float NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `id_agent` (`id_agent`,`id_produit`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
 
--
-- Contenu de la table `taux`
--
 
INSERT INTO `taux` (`id`, `id_agent`, `id_produit`, `taux`) VALUES
(1, 2, 2, 60),
(2, 1, 2, 50);
Je voudrai une vue qui m'affiche tous les agents et produits avec leurs taux correspondant soit au taux de la table Taux, sinon au taux de la table produits.

J'ai essayé ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
SELECT
	COALESCE(taux.id, 0) AS id,
	agents.id AS id_agent,
	produits.id AS id_produit,
	COALESCE(taux.taux, produits.taux) AS taux
FROM agents, produits
LEFT OUTER JOIN taux ON taux.id_agent = agents.id AND taux.id_produit = produits.id
Je voudrai donc que cette vue affiche :
id --- id_agent --- id_produit --- taux
0 ------- 1 ---------- 1 --------- 5
2 ------- 1 ---------- 2 --------- 50
1 ------- 2 ---------- 2 --------- 60
0 ------- 2 ---------- 2 --------- 10

Seulement cette vue ne fonctionne pas simplement parce que le LEFT OUTER JOIN ne se fais que sur produits.

D'après vous, serait il possible d'eviter quelque chose comme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
SELECT
	COALESCE((SELECT id FROM taux WHERE taux.id_agent = agents.id AND taux.id_produit = produits.id), 0) AS id
	agents.id AS id_agent,
	produits.id AS id_produit,
	COALESCE((SELECT taux FROM taux WHERE taux.id_agent = agents.id AND taux.id_produit = produits.id), produits.taux) AS taux
FROM agents, produits
Merci d'avance pour toute réponse.