En UNION ALL
L'opérateur peut être ce que vous recherchez.
Cet opérateur permet de concaténer les ensembles de résultats de plusieurs requêtes, en conservant toutes les lignes de chacune d'entre elles. Notez qu'une requête UNION
(sans l'opérateur ALL
) éliminera toutes les lignes "en double" qui existent dans le jeu de résultats. Le mot-clé UNION ALL
préserve toutes les lignes de chaque requête (et sera probablement plus performant puisqu'il n'a pas à effectuer la vérification des doublons et l'opération de suppression).
Le nombre de colonnes et le type de données de chaque colonne doivent correspondre dans chacune des requêtes. Si l'une des requêtes comporte plus de colonnes que l'autre, nous incluons parfois des expressions fictives dans l'autre requête pour que les colonnes et les types de données "correspondent". Souvent, il est utile d'inclure une expression (une colonne supplémentaire) dans la liste SELECT de chaque requête qui renvoie un littéral, afin de révéler laquelle des requêtes était la "source" de la ligne.
SELECT 'q1' AS source, a, b, c, d FROM t1 WHERE ...
UNION ALL
SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2 JOIN t3 ON ...
UNION ALL
SELECT 'q3', '1', '2', buckle, my_shoe FROM t4
Vous pouvez envelopper une telle requête dans un ensemble de parenthèses et l'utiliser comme une vue en ligne (ou "table dérivée", dans le jargon de MySQL), afin de pouvoir effectuer des opérations d'agrégation sur toutes les lignes.
SELECT t.a
, SUM(t.b)
, AVG(t.c)
FROM (
SELECT 'q1' AS source, a, b, c, d FROM t1
UNION ALL
SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2
) t
GROUP BY t.a
ORDER BY t.a